2012-08-27 57 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驗證過程中始終執行,它會永遠在當前語言返回消息。

相關問題