【问题标题】:Client side validation not working for hidden field in asp.net mvc 3客户端验证不适用于asp.net mvc 3中的隐藏字段
【发布时间】:2011-10-17 07:15:37
【问题描述】:

我有一个隐藏字段,其验证如下

@Html.HiddenFor(m => m.Rating)
@Html.ValidationMessageFor(m => m.Rating)

Rating 属性应用了Range 验证器属性,范围为 1-5。这被放在一个带有提交按钮的表单中。

然后我得到了以下 jquery,它在某些用户事件的隐藏字段中设置值(基本上用户点击一些星星来评分)

$(".star").click(function(){
    $("#Rating").val(2);
});

现在,如果我在没有设置隐藏字段的用户事件的情况下提交表单,则验证有效。错误消息显示正确,并且适​​用于所有客户端。

现在,在这种情况下,如果我点击星号,调用上面的 javascript 设置隐藏字段,验证错误消息不会消失。我可以在隐藏变量有一些有效值后提交表单。但我期望客户端验证应该有效。 (当隐藏变量设置了一些有效值时,验证错误应该消失)

最初我认为,jquery 验证会在一些特殊事件上被调用,所以我尝试自己引发 click、change、keyup、blur 和 focusout 事件,如下所示

$(".star").click(function(){
    $("#Rating").val(2);
    $("#Rating").change();
});

但这仍然不起作用。错误信息一旦出现,就不会消失。

【问题讨论】:

    标签: asp.net-mvc-3 jquery-validate asp.net-mvc-validation


    【解决方案1】:

    你可以用一个 div 包裹你的隐藏字段,放在某个地方,但仍然在 <form> 内。添加 css 将其踢到外太空。

    <div style="position:absolute; top:-9999px; left:-9999px">
    <input id="Rating" type="hidden" name="rating" >
    </div>
    

    然后将以下标签添加到您要显示错误的位置:

    <label for="rating" class="error" style="display:none">I am an an error message, please modify me.</label>
    

    【讨论】:

    • 我没有更多地从事这个项目,所以我无法尝试这个。但我喜欢这个建议,所以竖起大拇指:)
    • 这“就是”解决方案。谢谢。
    【解决方案2】:

    客户端验证会忽略隐藏字段。您可以动态设置“忽略”选项,但为了使其正常工作,我直接在 .js 文件中执行了以下操作。

    现在这应该可以解决问题。

    在我的 aspx...

    <%: Html.HiddenFor(model => model.age, new { @class="formValidator" }) %>
    

    在 jquery.validate.js 中

    ignore: ":hidden:not('.formValidator')",
    

    【讨论】:

      【解决方案3】:

      结果证明这是一个非常有趣的问题。默认的“忽略”设置是忽略隐藏字段。该字段隐藏在 jQuery ui 插件中。我只是在要验证的渲染输入中添加了一个名为“includeCheckBox”的类,并将以下代码行放入...

      var validator = $('#formMyPita').validate();
      validator.settings.ignore = ':hidden:not(".includeCheckBox")';
      if ($('#formMyPita').valid()) {....
      

      【讨论】:

        【解决方案4】:

        在设置隐藏字段值的代码中,手动调用表单验证,如下所示:

        $("form").validate().form();
        

        【讨论】:

        • 我认为您不需要在上述语句末尾调用 form()。
        • form() 是更新表单上的错误消息所必需的。由于问题是关于立即更新错误消息,因此需要。
        • @counsellorben 突然之间,上面的代码停止工作了。您能否就可能导致此功能停止工作的原因提出一些想法?
        • 你更新 jquery.validate.js 了吗?我还没有用 v. 1.9 测试过。
        【解决方案5】:

        我认为这是因为隐藏输入不会触发任何这些事件。

        您可以做的是使用&lt;input type="text" style="display:none" /&gt; 而不是隐藏字段;

        @html.TextBoxFor(m => m.Rating, new {display = "display:none"})
        

        【讨论】:

        • 这也不起作用。我最好的猜测是,在我设置隐藏变量之后,我需要引发一些 javascript 事件,比如 change/blur 再次触发验证。我不确定那个事件是什么
        • 是的,对于隐藏的文本框,您将触发 .change() 事件。我认为对于隐藏的输入,没有要附加的默认更改事件。
        • 不幸的是,这不起作用。在设置隐藏的文本框值后,我显式地触发了更改事件。但验证错误并没有消失
        • @Suhas 验证由 focusout 事件触发试试这个:$("#Rating").focusout();
        猜你喜欢
        • 2011-02-13
        • 1970-01-01
        • 1970-01-01
        • 2011-02-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-19
        相关资源
        最近更新 更多