2

我需要帮助来弄清楚如何在我的 ASP.NET MVC 3 应用程序中成功实现对字段的不显眼的客户端验证。我可以看到基本上启用了不显眼的客户端验证,因为 MVC 生成相关的 HTML。

在这种情况下,我想要实现的是在我输入时验证Bugs编辑器的输入(即相应的<input>元素),出于测试目的,我将属性的最大长度设置为 2。当我测试时,我可以告诉目前没有进行验证,所以至少缺少一些东西。因此,此问题的成功标准是对表单字段进行客户端验证Bugs

我可以在生成的 HTML 中看到一个可能的问题:该Verbose属性标记为Required模型中的属性,但其对应<input>的仍然获取dataval=true例如属性,<input>forBugs没有。不应该反过来,因为具有验证规则的字段应该得到dataval=true,以启用不显眼的验证?

与理解案例相关的代码如下,如果需要更多信息,请告诉我:

Options.cs

public class Options
{
    [Required, StringLength(2)]
    public string Bugs;
    public bool Verbose;
}

Options.cshtml

<script src="@Url.Content("~/Scripts/jquery-1.6.2.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

<div id="options-form">
  @using (Html.BeginForm())
  {
    @Html.ValidationSummary(true)
    <fieldset>
      <legend>Options</legend>
      <div class="editor-label">
        @Html.LabelFor(model => model.Bugs)
      </div>
      <div class="editor-field">
        @Html.EditorFor(model => model.Bugs)
        @Html.ValidationMessageFor(model => model.Bugs)
      </div>
      <div class="editor-label">
        @Html.LabelFor(model => model.Verbose)
      </div>
      <div class="editor-field">
        @Html.CheckBoxFor(model => model.Verbose)
        @Html.ValidationMessageFor(model => model.Verbose)
      </div>
   </fieldset>
  }
</div>

两个编辑器(forBugsVerbose)呈现如下:

<div id="options-form">
<form action="/Options" method="post">
  <fieldset>
    <legend>Options</legend>
      <div class="editor-label">
        <label for="Bugs">Bugs</label>
      </div>
      <div class="editor-field">
        <input class="text-box single-line" id="Bugs" name="Bugs" type="text" value="" />
        <span class="field-validation-valid" data-valmsg-for="Bugs" data-valmsg-replace="true"></span>
      </div>
      <div class="editor-label">
        <label for="Verbose">Verbose</label>
      </div>
      <div class="editor-field">
        <input data-val="true" data-val-required="The Boolean field is required." id="Verbose" name="Verbose" type="checkbox" value="true" /><input name="Verbose" type="hidden" value="false" />
        <span class="field-validation-valid" data-valmsg-for="Verbose" data-valmsg-replace="true"></span>
      </div>
    </fieldset>
  </form>
</div>
4

3 回答 3

4

Bugs并且Verbose是此代码中的公共字段,而不是属性。使它们成为属性,这应该可以解决它。

于 2011-09-01T14:02:44.403 回答
2

为and属性定义get;and 。这不仅会正确(添加)验证,而且在未来,模型绑定器将能够从服务器上的表单字段绑定模型回来。set;BugsVerbose

以及关于Verbose. 这是因为发生了对值类型的隐式要求验证。string 可以为空,因此如果您没有Required明确设置属性,则不需要它 - 所以 Bugs 不需要。但bool不能是nullc# 的本质,所以 mvc 会自动Required为其添加属性。你可以控制它

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;
于 2011-09-01T13:58:35.813 回答
0

我最近遇到了同样的问题(不显眼的客户端验证在 IE 中不起作用,但在其他浏览器中起作用)。原因是在 jQuery 版本中。我从 jQuery 1.6.x 版本回滚到 1.5.2 版本,它开始工作了。

于 2011-09-01T13:58:58.777 回答