我如何编写一个比较两个字段的自定义ValidationAttribute?这是常见的"输入密码","确认密码"方案.我需要确保两个字段相同并保持一致,我想通过DataAnnotations实现验证.
所以在伪代码中,我正在寻找一种方法来实现如下所示:
public class SignUpModel
{
[Required]
[Display(Name = "Password")]
public string Password { get; set; }
[Required]
[Display(Name = "Re-type Password")]
[Compare(CompareField = Password, ErrorMessage = "Passwords do not match")]
public string PasswordConfirm { get; set; }
}
public class CompareAttribute : ValidationAttribute
{
public CompareAttribute(object propertyToCompare)
{
// ??
}
public override bool IsValid(object value)
{
// ??
}
}
Run Code Online (Sandbox Code Playgroud)
所以问题是,我如何编码[Compare] ValidationAttribute?
基本上,标题是什么.我有几个属性组合在一起,真正做出一个逻辑答案,我想运行一个服务器端验证代码(我写),考虑到这些多个字段,并只连接到一个验证输出/错误消息,用户在网页上看到.
我查看了scott guthries扩展属性并在dataannotations声明中使用它的方法,但是,正如我所看到的,没有办法在多个属性上声明dataannotations-style属性,并且您只能放置声明(例如[电子邮件],[范围],[必填])超过一个属性:(.
我查看了启动新项目时出现的默认mvc 2.0项目中的PropertiesMustMatchAttribute,这个示例与使用一对引脚检查机油一样有用 - 没用!
我已经尝试过这种方法,但是,创建一个类级属性,并且不知道如何在我的aspx页面中显示错误.我已经尝试过html.ValidationMessage("ClassNameWhereAttributeIsAdded")和其他各种各样的东西,但它还没有用.我应该提一下,在这个级别上没有一篇关于进行验证的博客文章 - 尽管这是任何项目或业务逻辑场景中的常见需求!
任何人都可以帮助我在我的aspx页面中显示我的消息,并且如果可能的话还有一个适当的文档或参考解释在这个级别的验证?
我通过继承ValidationAttribute创建了一个自定义验证属性.该属性在类级别应用于我的viewmodel,因为它需要验证多个属性.
我压倒一切
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
Run Code Online (Sandbox Code Playgroud)
并返回:
new ValidationResult("Always Fail", new List<string> { "DateOfBirth" });
Run Code Online (Sandbox Code Playgroud)
在所有情况下,DateOfBirth是我的视图模型上的属性之一.
当我运行我的应用程序时,我可以看到它被击中.ModelState.IsValid正确设置为false但是当我检查ModelState内容时,我看到Property DateOfBirth不包含任何错误.相反,我有一个值为null的空字符串Key和一个包含我在验证属性中指定的字符串的异常.
这导致在使用ValidationMessageFor时,我的UI中不显示任何错误消息.如果我使用ValidationSummary,那么我可以看到错误.这是因为它与属性无关.
它看起来好像忽略了我在验证结果中指定了membername的事实.
为什么这样,我该如何解决?
要求的示例代码:
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = true)]
public class ExampleValidationAttribute : ValidationAttribute
{
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
// note that I will be doing complex validation of multiple properties when complete so this is why it is a class level attribute
return new ValidationResult("Always Fail", new List<string> { "DateOfBirth" });
} …Run Code Online (Sandbox Code Playgroud)