2012-08-27 23 views
2

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

回答

0

方法Application_Start仅调用一次,在应用开始。此外,属性被编译,所以它们可以在运行时读取(通过反射或元数据),但不会被修改。

0

我在自定义验证属性的构造函数中初始化ErrorMessage属性时遇到了同样的问题。

我的解决方案是覆盖IsValid方法。请拨打base.IsValid。如果此方法有效,则返回null,否则它将返回ValidationResult,您可以在其中设置ErrorMessage属性。

public class RequiredAttribute : System.ComponentModel.DataAnnotations.RequiredAttribute 
{  
      public RequiredAttribute() 
      { 
      } 

      protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
        { 
         string displayName = validationContext.DisplayName; 
         ValidationResult result = base.IsValid(value, validationContext); 
         if (result != null) 
          result.ErrorMessage = string.Format(GetTranslatation("RequiredField"), displayName); 
         return result; 
        } 
      } 
    } 

由于IsValid验证过程中始终执行,它会永远在当前语言返回消息。

相关问题