【问题标题】:MVC 3 validate 2 fields in different classesMVC 3 验证不同类中的 2 个字段
【发布时间】:2012-06-30 23:34:52
【问题描述】:

我有一个视图模型,里面有 2 个对象

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

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

ViewModel 包含这 2 个对象

如何实现验证,以便 PassportExpDate > returnedDate

【问题讨论】:

标签: asp.net-mvc validation viewmodel


【解决方案1】:

使用 FluentValidation.NET 和带有数据注释的 PITA 呈现完全微不足道的场景。

以下是简单的步骤:

  1. 安装FluentValidation.MVC3 NuGet 包
  2. Application_Start注册FV提供者:

    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>
    }
    

【讨论】:

  • 感谢您的回复。这似乎有效。我的视图模型确实还有一个问题。我期待一个 PersonData 数组。验证器的定义如何变化?谢谢
猜你喜欢
  • 2012-09-13
  • 2020-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多