0

モデルに 2 つのフィールドがあります

  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 だけに頼るべきではないと思います。アプリが公開されている場合は、クライアント側とサーバー側の両方の検証があることを確認してください。

また、モデル オブジェクト内にサーバー側の検証を実装するよりクリーンな方法は、以下に示すカスタム検証属性を使用して実行できます。これにより、検証が一元化され、コントローラーで日付を明示的に比較する必要がなくなります。

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 に答える