MVC3 / EF CustomValidator模型中的两个字段

时间:2011-08-31 11:23:53

标签: asp.net-mvc-3 entity-framework-4.1 data-annotations customvalidator

使用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添加到此验证器的视图中。

2 个答案:

答案 0 :(得分:2)

而不是在模型类上使用数据注释实现IValidatableObject - 在交叉验证的场景中,它更简单,更清晰。

如果您仍想使用ValidationAttribute,则IsValid方法中有两个参数:

  • value表示已分配属性的属性的验证值
  • context是验证属性的上下文。它还包含ObjectInstanceObjectType属性,用于访问整个模型及其类型,以便您可以强制转换实例并访问其他属性。

答案 1 :(得分:0)

MVC custom validation: compare two dates中提出的问题有一个验证器示例,它与模型中的第二个值进行比较。这应该让你开始。