必需属性,如何从数据库加载错误消息? MVC

时间:2015-01-07 15:51:53

标签: asp.net-mvc

如何使用数据库中的错误消息字符串作为必需的错误消息?

对于Required validation属性,在我的地址模型中,我想使用存储在我的数据库中的错误消息,而不是硬编码。它来自数据库而不是resx文件。

在我目前的代码中,我使用SSPResourceManager类基于ErrorMessageResourceName调用数据库。这并不适用于依赖注入的原因。是否有另一种方法。

当前代码

模型

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

我在这里寻找静态属性" SSP_Validation_Required"来自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); 
        }
    }
}

这种方法不起作用,因为我在注入Itranslation dependecy方面遇到了问题。

是否有另一种方法从数据库加载错误消息并在必需属性中使用?

1 个答案:

答案 0 :(得分:0)

解决问题的方法是基于RequiredAttribute

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

CustomMetadataProvider

上创建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;
            }
        }

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

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