1

内部に2つのオブジェクトを持つビューモデルがあります

class trip
{
    public DateTime returnedDate {get;set;}
    ....
}

class personData
{
   public DateTime PassportExpDate {get;set;}
    ....
}

ViewModel にはこれら 2 つのオブジェクトが含まれています

PassportExpDate > returnedDate になるように検証を実装するにはどうすればよいですか

4

1 に答える 1

1

FluentValidation.NETと PITA with Data Annotations を使用して、シナリオを完全に簡単にします。

簡単な手順は次のとおりです。

  1. FluentValidation.MVC3NuGet パッケージをインストールする
  2. で FV プロバイダーを登録しますApplication_Start

    FluentValidationModelValidatorProvider.Configure();
    
  3. ビュー モデルを設計します (注意: これは純粋なビュー モデルではありません。純粋なビュー モデルはドメイン モデルを参照するべきではありませんが、このデモンストレーションではそのままにしておきます)。

    [Validator(typeof(MyViewModelValidator))]
    public class MyViewModel
    {
        public Trip Trip { get; set; }
        public PersonData PersonData { get; set; }
    }
    
  4. 次に、ビュー モデルに対応する FV バリデータを定義します。

    public class MyViewModelValidator : AbstractValidator<MyViewModel>
    {
        public MyViewModelValidator()
        {
            RuleFor(x => x.Trip.ReturnDate)
                .LessThan(x => x.PersonData.PassportExpDate)
                .WithMessage("You wanna get arrested?");
        }
    }
    
  5. コントローラ:

    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            var model = new MyViewModel
            {
                Trip = new Trip
                {
                    ReturnDate = new DateTime(2012, 8, 13)
                },
                PersonData = new PersonData
                {
                    PassportExpDate = new DateTime(2012, 8, 12)
                }
            };
            return View(model);
        }
    
        [HttpPost]
        public ActionResult Index(MyViewModel model)
        {
            return View(model);
        }
    }
    
  6. 意見:

    @model MyViewModel
    
    @using (Html.BeginForm())
    {
        <div>
            @Html.LabelFor(x => x.Trip.ReturnDate)
            @Html.EditorFor(x => x.Trip.ReturnDate)
            @Html.ValidationMessageFor(x => x.Trip.ReturnDate)
        </div>
        <div>
            @Html.LabelFor(x => x.PersonData.PassportExpDate)
            @Html.EditorFor(x => x.PersonData.PassportExpDate)
            @Html.ValidationMessageFor(x => x.PersonData.PassportExpDate)
        </div>
    
        <button type="submit">OK</button>
    }
    
于 2012-07-01T06:05:16.500 に答える