我有一种情况,我想与字段进行比较(例如,确保开始时间在结束时间之前).我正在使用System.ComponentModel.DataAnnotations属性进行验证.
我的第一个想法是这样的:
public enum CompareToOperation
{
EqualTo,
LessThan,
GreaterThan
}
public class CompareToAttribute : ValidationAttribute
{
CompareToOperation _Operation;
IComparable _Comparision;
public CompareToAttribute(CompareToOperation operation, Func<IComparable> comparison)
{
_Operation = operation;
_Comparision = comparison();
}
public override bool IsValid(object value)
{
if (!(value is IComparable))
return false;
switch (_Operation)
{
case CompareToOperation.EqualTo: return _Comparision.Equals(value);
case CompareToOperation.GreaterThan: return _Comparision.CompareTo(value) == 1;
case CompareToOperation.LessThan: return _Comparision.CompareTo(value) == -1;
}
return false;
}
}
public class SimpleClass
{
public DateTime Start {get;set;}
[CompareTo(CompareToOperation.GreaterThan, …Run Code Online (Sandbox Code Playgroud) 我通过继承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)