【问题标题】:Enabling MVC client side validation启用 MVC 客户端验证
【发布时间】:2016-12-17 19:55:01
【问题描述】:

我有

<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />

在我的配置中和

    Html.EnableClientValidation(true);
    Html.EnableUnobtrusiveJavaScript(true);

在我看来和

    <script src="~/js/jquery.validate.min.js"></script>
<script src="~/js/jquery.validate.unobtrusive.min.js"></script>

在 HTML 源代码中(与 jQuery 一样)(浏览器中没有 JS 错误)

我有一个带有[Required] 的表单元素,并且该表单元素似乎可以通过关联的data- 属性渲染

<div class='form-group'>
                <label class="col-md-2 control-label" for="Username">en-gb(Username)</label>
                <div class='col-md-10'>
                    <div class='input-group'>
                        <div class='input-group-addon'><span class='fa fa-user'></span></div>
                        <input class="input-validation-error form-control" id="Username" name="Username" type="text" value="" />
                    </div>
                    <span class="field-validation-error help-block" data-valmsg-for="Username" data-valmsg-replace="true">en-gb(The en-gb(Username) field is required.)</span>
                    </div>
                </div>

但是没有进行客户端验证;表单始终提交到服务器。

我错过了什么?我应该检查什么?

编辑 TextBoxForSystem.Web.Mvc.Html.InputHelpers 中并调用 TextBoxHelper,后者又在同一文件中调用 InputHelper。这叫 htmlHelper.GetUnobtrusiveValidationAttributes(name, metadata) 看起来像这样:

public IDictionary<string, object> GetUnobtrusiveValidationAttributes(string name, ModelMetadata metadata)
    {
        Dictionary<string, object> results = new Dictionary<string, object>();

        // The ordering of these 3 checks (and the early exits) is for performance reasons.
        if (!ViewContext.UnobtrusiveJavaScriptEnabled)
        {
            return results;
        }

        FormContext formContext = ViewContext.GetFormContextForClientValidation();
        if (formContext == null)
        {
            return results;
        }

        string fullName = ViewData.TemplateInfo.GetFullHtmlFieldName(name);
        if (formContext.RenderedField(fullName))
        {
            return results;
        }

        formContext.RenderedField(fullName, true);

        IEnumerable<ModelClientValidationRule> clientRules = ClientValidationRuleFactory(name, metadata);
        UnobtrusiveValidationAttributesGenerator.GetValidationAttributes(clientRules, results);

        return results;
    }

(来源:http://aspnetwebstack.codeplex.com/SourceControl/changeset/view/5cb74eb3b2f3#src/System.Web.Mvc/HtmlHelper.cs

我遇到的问题是 formContext.RenderedField(fullName) 返回 true,因此我的 input 元素中没有添加任何验证属性。

【问题讨论】:

  • 在您显示的 html 中,客户端验证不需要 data-val-* 属性!你是如何生成这个html的?它是否在 &lt;form&gt; 元素内?
  • 只是@TextBoxFor(m =&gt; m.Username)@ValidationMessageFor(m =&gt; m.Username)
  • 不应该有data-val-required属性吗?
  • 刚刚设置了一个新的 MVC 项目(默认情况下启用了客户端验证),看起来我的 input 元素没有设置验证属性。这是来自模板项目的 HTML。 ` ```
  • 那么我只能建议它要么不在表单中,要么您在@TextBoxFor(m =&gt; m.Username)之前还为该属性生成了另一个输入(可能是隐藏输入)

标签: asp.net-mvc validation razor


【解决方案1】:

在你看来,你是在渲染下面的代码吗?

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

假设您使用的是默认项目模板,您需要将其包含在您正在呈现的视图中以启用客户端验证...或者,将 Scripts.Render("~/bundles/jqueryval") 添加到布局文件的底部以在您的所有视图中启用它。

还要确保 bundles/jqueryval 在 Bundles 配置文件中定义。

【讨论】:

  • 不等于
     
【解决方案2】:

formContext.RenderedField(fullName) 是一个红鲱鱼,我真的不知道那是什么。

问题是我已经对ValidationAttribute 类进行了子类化,以便通过从数据库而不是从 resx 中查找来提供全球化。这意味着它们不会出现在ModelMetadata 中。

一种解决方案是在被覆盖的属性上实现接口System.Web.Mvc.IClientValidatable。但是,基类没有实现这个接口,所以它们必须通过其他机制配置客户端验证——而且这种机制还不够聪明,无法获取开箱即用的子类@ 987654325@s.

【讨论】:

    猜你喜欢
    • 2012-07-29
    • 2010-09-14
    • 2014-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-06
    • 2014-06-11
    相关资源
    最近更新 更多