使用万无一失和 requiredif 来验证字符串字段

Using foolproof and requiredif to validate a string field

我的数据模型中有以下字段:

 public bool JointAccount { get; set; }

 [RequiredIf("JointAccount", "true", ErrorMessage = "Please select a Title")]
 public string JointAccountTitle { get; set; }

 [RequiredIf("JointAccount", "true", ErrorMessage = "Please enter first name")]
 public string JointAccountFirstName { get; set; }

我有以下看法:

<div class="form-group">
  @Html.Label("Joint Account?", htmlAttributes: new { @class = "control-label col-md-4" })
  <div class="col-md-8">
    <div class="checkbox">
      @Html.EditorFor(model => model.JointAccount)
      @Html.ValidationMessageFor(model => model.JointAccount, "", new { @class = "text-danger" })
    </div>
  </div>
</div>

<div class="form-group">
                        @Html.Label("Title", htmlAttributes: new { @class = "control-label col-md-4" })
                        <div class="col-md-8">
                            <select required style="width:100%;height:35px;border-radius:4px;padding-left:10px;" id="JointAccountTitle" name="JointAccountTitle" class="form-control input required">
                                <option value="">Please Select Title</option>
                                <option value="Mr">Mr</option>
                                <option value="Ms">Ms</option>
                                <option value="Miss">Miss</option>
                                <option value="Mrs">Mrs</option>
                                <option value="Fr">Fr</option>
                                <option value="Dr">Dr</option>
                                <option value="Prof">Prof</option>
                                <option value="Rev">Rev</option>
                                <option value="Sr">Sr</option>
                                <option value="Br">Br</option>
                            </select>
                            @Html.ValidationMessageFor(model => model.JointAccountTitle, "", new { @class = "text-danger" })
                        </div>
                    </div>

                    <div class="form-group">
                        @Html.Label("First Name", htmlAttributes: new { @class = "control-label col-md-4" })
                        <div class="col-md-8">
                            @Html.EditorFor(model => model.JointAccountFirstName, new { htmlAttributes = new { @class = "form-control" } })
                            @Html.ValidationMessageFor(model => model.JointAccountFirstName, "", new { @class = "text-danger" })
                        </div>
                    </div>

如果联合帐户复选框被填充,我试图确保在此处输入数据,但它似乎不会仅在标题下拉列表中的文本框上抛出任何验证错误,这里有什么想法吗?

我最近 运行 遇到了同样的问题。尝试将 .EditorFor() 替换为 .TextBoxFor():

@Html.TextBoxFor(model => model.JointAccountFirstName, new { htmlAttributes = new { @class = "form-control" } })

不确定为什么这是 Foolproof 的问题,但它对我有用。

您手动创建了 <select> 元素,但没有添加 jquery.validate.unobtrusive.js 所需的必要 data-val-* 属性来为 jquery.validate.js 添加规则,因此您永远无法获得 jquery 对 <select> 的验证(请注意 required 属性是 HTML5 验证,而不是 jquery 验证)。

如果您声称您在 JointAccountTitle 属性(下拉列表)上获得验证,但在 JointAccountFirstName(文本框)上没有获得验证,则意味着 jquery 客户端甚至没有触发侧面验证。最可能的原因是您没有加载正确的脚本,或者它们以错误的顺序加载。你需要

jquery-{version}.js
jquery.validate.js
jquery.validate.unobtrusive.js
mvcfoolproof.unobtrusive.js

要对 select 列表进行 jquery 验证,您需要将相关的 data-val- 属性添加到您的手册中 html,或者更好的是,生成您的下拉列表使用 DropDownListFor() 方法

@Html.DropDownListFor(m => m.JointAccountTitle, Model TitleList, "Please select title", new { @ class="form-control input })

其中 TitleList 是视图模型中的 IEnumerable<SelectListItem> 属性,其中包含选项

的值