如何使用数据库中的错误消息字符串作为必需的错误消息?
对于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方面遇到了问题。
是否有另一种方法从数据库加载错误消息并在必需属性中使用?
答案 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; }
}