我們爲我們的MVC3應用程序編寫了自定義RegularExpressionAttribute
。定製RegularExpressionAttribute
的目的在於,我們希望用關鍵字替換資源文件消息中的令牌。例如。 「字段__有一些無效字符」。在自定義RegularExpressionAttribute中,構造函數在第一次後未調用
所以我們想用Address
關鍵字替換_
令牌。
ResourceManager(_resourceManagerType.FullName,
System.Reflection.Assembly.Load(AssemblyNames.TRUETRAC_RESOURCES)).GetString(_errorMessageResourceName).Replace("_","Address");
的自定義屬性是如下,
public class CustomRegularExpressionAttribute : RegularExpressionAttribute
{
string _errorMessageResourceName;
Type _resourceManagerType;
public CustomRegularExpressionAttribute(string _pattern, string fieldName, string errorMessageResourceName, Type resourceManagerType)
: base(_pattern)
{
_errorMessageResourceName = errorMessageResourceName;
_resourceManagerType = resourceManagerType;
this.ErrorMessage = FormatErrorMessage(fieldName);
}
public override string FormatErrorMessage(string fieldName)
{
return //Resources.en_MessageResource.ResourceManager.GetString(fieldName);
new ResourceManager(_resourceManagerType.FullName, System.Reflection.Assembly.Load(AssemblyNames.TRUETRAC_RESOURCES)).GetString(_errorMessageResourceName).Replace("__", fieldName);
}
}
public class CustomRegularExpressionValidator : DataAnnotationsModelValidator<CustomRegularExpressionAttribute>
{
private readonly string _message;
private readonly string _pattern;
public CustomRegularExpressionValidator(ModelMetadata metadata, ControllerContext context, CustomRegularExpressionAttribute attribute)
: base(metadata, context, attribute)
{
_pattern = attribute.Pattern;
_message = attribute.ErrorMessage;
}
public override IEnumerable<ModelClientValidationRule> GetClientValidationRules()
{
var rule = new ModelClientValidationRule
{
ErrorMessage = _message,
ValidationType = "regex"
};
rule.ValidationParameters.Add("pattern", _pattern);
return new[] { rule };
}
}
然後我們登記Global.aspx Application_Start事件此屬性。
void Application_Start(object sender, EventArgs e)
{
AreaRegistration.RegisterAllAreas();
// Register CustomRegularExpressionValidator
DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(CustomRegularExpressionAttribute), typeof(CustomRegularExpressionValidator));
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}
並應用於我們的模型的屬性,如認爲:
[CustomRegularExpression(RegularExpression.Alphanumeric, "Address", "CV_Address", typeof(Resources.en_MessageResource))]
public string Address { get; set; }
問題是,我們正在實施在我們的應用和CustomRegularExpressionAttribute
構造呼籲只有一次定位。 如果開始的應用文化是英語,然後我們將應用程序的文化改爲西班牙文,但CustomRegularExpressionAttribute
的消息仍以英文顯示,因爲CustomRegularExpressionAttribute
的構造函數僅呼叫一次,並且它已被呼叫英文消息。
任何人都可以說明爲什麼是這個問題?爲什麼CustomRegularExpressionAttribute
的構造函數沒有調用每個請求?