FluentValidation Rulefor( ...reading a COMBO)

本文关键字:COMBO reading Rulefor FluentValidation | 更新日期: 2023-09-27 18:17:55

使用c# FluentValidation Rulefor() for MVC3检查Combo是否有值的正确方法是什么?

我有一个包含3个组合框的出生日期集

    @Html.DatePickerDropDowns(Html.FieldNameFor(x => x.DateOfBirthDay),
                              Html.FieldNameFor(x => x.DateOfBirthMonth),
                              Html.FieldNameFor(x => x.DateOfBirthYear),
                                 DateTime.Now.Year - 110,
                                 DateTime.Now.Year,
                                 Model.DateOfBirthDay,
                                 Model.DateOfBirthMonth,
                                 Model.DateOfBirthYear)
    @Html.ValidationMessageFor(model => model.DateOfBirthDay)
    @Html.ValidationMessageFor(model => model.DateOfBirthMonth)
    @Html.ValidationMessageFor(model => model.DateOfBirthYear)

每个组合显示"日"或"月"或"年"
他们每个人都有自己的相关列表。

所以我想检查用户是否选择了0到31中的一个值。

   RuleFor(x => x.DateOfBirthDay).NotEqual(0).WithMessage("Day is required");
   RuleFor(x => x.DateOfBirthMonth).NotEqual(0).WithMessage("Month is required");
   RuleFor(x => x.DateOfBirthYear).NotEqual(0).WithMessage("Year is required");

例如,DateOfBirthDay HTML输出组合如下所示:

  "0" - Day  
  "1" - 1  
  "2" - 2  
   ...till 31  

当我运行ModelState。如果是有效的,它不会选择用户没有触摸任何组合值的事实,将索引保留为"0"。

FluentValidation Rulefor( ...reading a COMBO)

我不确定"DatePickerDropdowns"是什么,但是FluentValidation对于这种情况有特殊的逻辑。使用. notempty(),而不是将Day设置为0,而是将其保留为空。使用默认的DropDownListFor,你可以将选项参数设置为"Day",这将自动发生。

你写了DatePickerDropDowns帮助吗?我就不会这样做了。我将使用单个DateTime,然后创建一个EditorTemplate,为该类型创建3个下拉(如果它是唯一的DateTime,否则使用UIHint指定自定义模板)。

//像这样的东西会工作吗?我假设你在看它是否等于"…"

?
string somestring = new string('.',3);
this.RuleFor(x => x.MyComboList).Equals(somestring);

//

this.RuleFor(x => x.MyComboList).NotEqual(0).WithMessage("...");