我们为我们的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
的构造函数没有调用每个请求?