我的任务是更改MVC2.0中DataAnnotation验证属性的ErrorMessage属性。例如,我应该能够为Model属性传递ID而不是实际的错误消息,并使用该ID从另一个服务(例如数据库)检索某些内容(错误消息),并在View中显示该错误消息而不是ID。为此,我需要设置DataAnnotation验证属性的ErrorMessage属性。
[StringLength(2, ErrorMessage = "EmailContentID.")]
[DataType(DataType.EmailAddress)]
public string Email { get; set; }
通过重写DataAnnotationsModelValidatorProvider来看似乎是一项简单的任务 protected override IEnumerable GetValidators(ModelMetadata metadata,ControllerContext context,IEnumerable attributes)
然而,这似乎很复杂。
一个。 MVC DatannotationsModelValidator的ErrorMessage属性是只读的。所以我不能在这里设置任何东西 湾System.ComponentModel.DataAnnotationErrorMessage属性(get和set)已在MVC DatannotationsModelValidator中设置,因此我们无法再次设置。如果您尝试设置,则会显示“属性不能设置多次...”错误消息。
public class CustomDataAnnotationProvider : DataAnnotationsModelValidatorProvider
{
protected override IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata, ControllerContext context, IEnumerable<Attribute> attributes)
{
IEnumerable<ModelValidator> validators = base.GetValidators(metadata, context, attributes);
foreach (ValidationAttribute validator in validators.OfType<ValidationAttribute>())
{
messageId = validator.ErrorMessage;
validator.ErrorMessage = "Error string from DB And" + messageId ;
}
//......
}
}
有人可以帮我吗?
答案 0 :(得分:2)
以下是问题:您更改错误消息属性的动机是什么?
仔细考虑这一点,因为您正在走向一条混淆应用程序实际发生情况的路径。当然数据库信息很有用,但它实际上并不是验证的一部分,也不应该是。
当你朝这个方向前进时,你基本上是说如果存在数据库问题,验证只能是无效的。我看到两个问题:
我不喜欢上述两种情况中的任何一种。
你能解决这个问题吗?可能您将创建自己的自定义验证属性。我必须检查并确保这是正确的。另一种选择是针对自定义验证:http://haacked.com/archive/2009/11/19/aspnetmvc2-custom-validation.aspx
这篇文章也可以帮助你走向你想要的方向:
你想解决这个问题吗?如果您试图在应用程序中保持适当的关注点分离,那并不是真的。我不会用数据库错误(我无效,但数据库也爆炸)来判断我的验证错误消息(这是无效的)。只是我的两分钱。
答案 1 :(得分:0)
有通过资源获取错误消息的内置方法。而不是数据库查找以在运行时获取资源,而是从数据库生成资源并将其用于错误消息。
然后,您可以使用ErrorMessageResourceName
和ErrorMessageResourceType
来允许DataAnnotation执行资源查找,而不是对特定字符串进行硬编码。
public sealed class MyModel
{
[Required(
ErrorMessageResourceName="MyDescriptionResource",
ErrorMessageResourceType=typeof(MyCustomResource))]
public string Description { get; set; }
}
答案 2 :(得分:0)
另外,您可能需要查看msdn上的ValidationAttribute.FormatErrorMessage Method。
此方法格式化错误消息 通过使用ErrorMessageString 属性。此方法附加名称 触发的数据字段 格式化错误消息的错误。 您可以自定义错误的方式 通过创建一个来格式化消息 派生类覆盖它 方法
快速样本(并不是一个明确的例子)
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false,
Inherited = true)]
public sealed class PostCodeValidationAttribute
: ValidationAttribute
{
public override bool IsValid(object value)
{
if( value == null )
return true;
string postCode = value as string;
if( string.IsNullOrEmpty(postCode) )
return true;
if ( !PostCode.IsValidPostCode(postCode, this.PostCodeStyle) )
return false;
return true;
}
public PostCodeStyle PostCodeStyle { get; set; }
public override string FormatErrorMessage(string name)
{
return string.Format(
"{0} is not a valid postcode for {1}", name, PostCodeStyle);
}
}
*我省略了PostCodeStyle
枚举以及用于验证邮政编码的PostCode
类。