0

我的模型中有两个字段

  1. 创建日期到
  2. 创建日期从

像这样呈现

<b>Start Date</b>  @Html.EditorFor(model => model.AdvanceSearch.CreateDatefrom, new {  @class = "picker startDate" })

<b>End Date</b> @Html.EditorFor(model => model.AdvanceSearch.CreateDateto, new { @class = "picker endDate" })

我有一个验证方案,结束日期不应大于开始日期,目前我正在通过 jquery 验证它

$.validator.addMethod("endDate", function (value, element) {
        var startDate = $('.startDate').val();
        return Date.parse(startDate) <= Date.parse(value);
    }, "* End date must be Equal/After start date");

我想知道在 MVC3 模型验证中有什么方法可以做到这一点吗?

4

2 回答 2

6

我会说你不应该仅仅依赖 Javascript,除非你在某种 Intranet 应用程序中控制你的客户端的浏览器。如果应用程序是面向公众的 - 确保您有客户端和服务器端验证。

此外,在模型对象中实现服务器端验证的更简洁的方法可以使用如下所示的自定义验证属性来完成。然后您的验证变得集中,您不必明确比较控制器中的日期。

public class MustBeGreaterThanAttribute : ValidationAttribute
{
    private readonly string _otherProperty;

    public MustBeGreaterThanAttribute(string otherProperty, string errorMessage) : base(errorMessage)
    {
        _otherProperty = otherProperty;
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        var otherProperty = validationContext.ObjectInstance.GetType().GetProperty(_otherProperty);
        var otherValue = otherProperty.GetValue(validationContext.ObjectInstance, null);
        var thisDateValue = Convert.ToDateTime(value);
        var otherDateValue = Convert.ToDateTime(otherValue);

        if (thisDateValue > otherDateValue)
        {
            return ValidationResult.Success;
        }

        return new ValidationResult(FormatErrorMessage(validationContext.DisplayName));
    }
}

然后可以将其应用于您的模型,如下所示:

public class MyViewModel
{
    [MustBeGreaterThan("End", "Start date must be greater than End date")]
    public DateTime Start { get; set; }

    public DateTime End { get; set; }

    // more properties...
}
于 2012-11-27T10:11:05.093 回答
2

您需要针对模型创建自定义验证。您可以在 if(Model.IsValid) 之后将其放入控制器中


if(Model.End<Model.StartDate)
   ....

但我会坚持使用 javascript。它在客户端工作,不会命中服务器。除非你只需要额外的保证。

于 2012-11-27T05:59:11.073 回答