使用MVC3和EF4.1如何在客户端和服务器上验证视图模型中的多个字段?
我有一个开始日期文本框(可以修改),我在隐藏字段中有原始开始日期。当用户提交表单时,我想检查原始开始日期任一侧的修改开始日期是否不超过一个月。
我无法弄清楚如何使用DataAnnotation和CustomValidation完成这项工作(或者我可能会走错路)?这是我一直在使用的一个例子:
[MetadataType(typeof(Metadata.MyUserMetaData))]
public partial class MyUser
{
public System.DateTime DateOfBirth { get; set; }
}
部分班级
public class MyUserMetaData
{
[CustomValidation(typeof(AmendedStartDate), "amendedstartdate", ErrorMessage = "Invalid date."]
public DateTime StartDate { get; set; };
public DateTime OriginalStartDate { get; set; };
}
自定义验证器
public class AmendedStartDate : ValidationAttribute, IClientValidatable
{
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
// How do I get multiple field values from object value?
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(Modelmetadata metadate, ControllerContext context)
{
var rule = new ModelClientValidationRule
{
ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()),
ValidationType = "amendedstartdate"
};
yield return rule;
}
}
我知道我仍然要将jQuery添加到此验证器的视图中。
答案 0 :(得分:2)
而不是在模型类上使用数据注释实现IValidatableObject
- 在交叉验证的场景中,它更简单,更清晰。
如果您仍想使用ValidationAttribute
,则IsValid
方法中有两个参数:
value
表示已分配属性的属性的验证值context
是验证属性的上下文。它还包含ObjectInstance
和ObjectType
属性,用于访问整个模型及其类型,以便您可以强制转换实例并访问其他属性。答案 1 :(得分:0)
MVC custom validation: compare two dates中提出的问题有一个验证器示例,它与模型中的第二个值进行比较。这应该让你开始。