MVC DropDownListFor的FluentValidation规则?

时间:2014-05-30 18:00:48

标签: asp.net-mvc asp.net-mvc-4 fluentvalidation

我正在尝试使用FluentValidation验证下拉列表。我想我做错了,但找不到解决办法。我需要你的帮助。

模型

 [FluentValidation.Attributes.Validator(typeof (MeetingAbstractValidator))]
 public class MeetingAbstract
 {
     public string CompanyAllowedBoolLabel { get; set; }
     public string CompanyAllowedBoolOptions { get; set; }
     public string CompanyAllowedBoolText { get; set; }
     ...
 }



class MeetingAbstractValidator : AbstractValidator<MeetingAbstract>
{
     public MeetingAbstractValidator()
     {
        RuleFor(x => x.CompanyAllowedBoolText).NotEqual("Select Option...").
        WithMessage(i18n_Models_Abstract.RequiredField); ;

  }
}

视图

<div class="row" style="padding-bottom: 10px">
    <div class="col-md-10">
        <div class="col-md-6">@Html.Label(Model.CompanyAllowedBoolLabel, 
               new { @class = "control-label mandatory" })</div>
        <div class="col-md-4">
            @{

                var options = Model.CompanyAllowedBoolOptions;
                var optionsList = options.Split(',').ToList();
                var optionSelect = optionsList.Select(option => 
                 new SelectListItem() { Text = option, Value = option }).ToList();
                optionSelect.Insert(0,new SelectListItem() {
                             Text = "Select Option...", Value = "0" });
            }
            @Html.DropDownListFor(model => model.CompanyAllowedBoolText, 
                optionSelect,
                 new { @class = "input-validation-error form-control" })
            @Html.ValidationMessageFor(model => model.CompanyAllowedBoolText)
        </div>
    </div>
</div>

生成的HTML

<div class="col-md-4">
   <select class="form-control valid" id="CompanyAllowedBoolText"   
                              Name="CompanyAllowedBoolText">
          <option value="0">Select Option...</option>
          <option value="да/yes">да/yes</option>
          <option value="нет/no">нет/no</option>
    </select>
    <span class="field-validation-valid" data-valmsg-for="CompanyAllowedBoolText"
       data-valmsg-replace="true"></span>
 </div>

它适用于文本框。不是下拉。

3 个答案:

答案 0 :(得分:3)

确保选择选项

的值为空
  

optionSelect.Insert(0,new SelectListItem(){                                Text =“Select Option ...”,Value =“”});

然后添加此

  

RuleFor x =&gt; x.CompanyAllowedBoolText )。 NotEmpty()。WithMessage(“您的错误   消息“)

答案 1 :(得分:0)

部分问题是您不应该验证特定类型的控件。验证下拉列表应该与验证文本框没有区别,它与所选值有关。当表单将DropDownList发布到服务器时,它只发布值,而不是文本。您正在检查文字。

问题的另一部分是您没有正确构建下拉列表。您应该对未选择的值使用内置功能。我不确定您为什么要尝试包含验证css类。你不应该。即:

@Html.DropDownListFor(model => model.CompanyAllowedBoolText, optionSelect, 
     "Select Option...")

在这种情况下,如果用户没有选择任何内容,则该值将为null或为空。所以你只需要使用必要的验证。请记住,文本没有发布,只有值。

RuleFor(x => x.CompanyAllowedBoolText).NotNull().NotEmpty().
    WithMessage(i18n_Models_Abstract.RequiredField);

答案 2 :(得分:0)

根据您生成的html(以及下拉创建代码),CompanyAllowedBoolText的发布值可以是

  • 0
  • да/是
  • нет/无

因此选项的值为VALUE,而不是选项的“text”。

所以你的规则应该检查

RuleFor(x => x.CompanyAllowedBoolText).NotEqual("0").<bla bla bla>();