2015-01-07 63 views
1

如何使用數據庫中的錯誤消息字符串作爲必需的錯誤消息?必需Atrribute,如何從數據庫加載錯誤消息? MVC

對於Required驗證屬性,在我的地址模型中,我想使用存儲在我的數據庫中的錯誤消息,而不是對其進行硬編碼。它來自數據庫而不是resx文件。

在我當前的代碼中,我使用SSPResourceManager類來調用基於ErrorMessageResourceName的數據庫。這不適用於依賴注入的原因。還有另一種方法。

目前代碼

型號

public abstract class AddressVM 
{ 
    [Required(ErrorMessageResourceType = typeof(SSPResourceManager), ErrorMessageResourceName = "SSP_Validation_Required")] 
    [StringLength(50)] 
    public string Name { get; set; } 
} 

在這裏,我正在尋找從SSPResourceManager類

SSPResourceManager類

public class SSPResourceManager 
{ 
    private static ITranslationService _translationService = EnterpriseLibraryContainer.Current.GetInstance<ITranslationService>(); 

    private static string _languageCode = System.Web.HttpContext.Current.Session["LanguageCode"].ToString(); 

    public static string SSP_Validation_Required 
    { 
     get 
     { 
      // call database and retrive the correct error string 
      return _translationService.Read("SSP_Validation_Required", "SSP", _languageCode); 
     } 
    } 
} 

日的靜態屬性 「SSP_Validation_Required」是方法不起作用,因爲我有問題注入Itranslation依賴。

是否有另一種方法從數據庫加載錯誤消息並在必需的屬性中使用?

+0

不幸的是,這並不容易或直截了當。默認的DataAnnotationValidationProvider僅支持資源文件或靜態類。我能夠在這裏找到一個解決方案:http://geekswithblogs.net/shaunxu/archive/2012/09/04/localization-in-asp.net-mvc-ndash-upgraded.aspx,但就像我說的,你已經爲自己裁剪了一些工作。 –

回答

0

甲方式來解決這個問題是通過根據RequiredAttribute

public class ResourceErrorMessage : RequiredAttribute 
{ 
    public ResourceErrorMessage(string resourceKey): base() 
    { 
      this.ErrorMessage = DependencyResolver.Current.GetService<ITranslationService>().Translate(ResourceKey, Thread.CurrentThread.CurrentCulture.TwoLetterISOLanguageName); 
    } 
} 

創建新類來創建上DataAnnotationsModelMetadataProvider

public class CustomMetadataProvider : DataAnnotationsModelMetadataProvider 
    { 
     protected override ModelMetadata CreateMetadata(
           IEnumerable<Attribute> attributes, 
           Type containerType, 
           Func<object> modelAccessor, 
           Type modelType, 
           string propertyName) 
      { 
       var data = base.CreateMetadata(attributes, 
              containerType, 
             modelAccessor, 
             modelType, 
             propertyName); 

       var resourceErrorMessage = attributes 
          .SingleOrDefault(a => typeof(ResourceErrorMessage) == a.GetType()); 
       if (resourceErrorMessage != null) data.AdditionalValues 
          .Add("ResourceErrorMessage", ((ResourceErrorMessage)resourceErrorMessage).ResourceKey); 

       return data; 
      } 
     } 

一個CustomMetadataProvider鹼在global.asax Application_Start()添加 ModelMetadataProviders.Current = new CustomMetadataProvider(); 並在您的模型上使用它

public class TestModel 
{ 
    [ResourceErrorMessage("somestring")] 
    public int TextAttribute{ set; get; } 
} 
相關問題