【问题标题】:ASP.NET MVC4 - Hidden field validation not clearing after value is setASP.NET MVC4 - 设置值后未清除隐藏字段验证
【发布时间】:2014-02-27 15:30:30
【问题描述】:

我的表单上有一个必填字段。当用户使用 jQuery UI 自动完成从文本框中选择一个值时,会填充隐藏字段。我已将表单验证器设置为不忽略隐藏字段,以便验证真正起作用。验证确实有效,但是当用户从自动完成中选择所需的选项,然后填充隐藏字段时,验证消息将不会清除,并且会在表单发布之前显示。一旦设置了隐藏字段,我是否需要手动调用 $('form').validate() 或其他东西,或者有没有办法在没有任何额外的 javascript 代码的情况下清除它?

我的视图模型:

public class IndexViewModel
{
    public string SchoolName { get; set; }
    [Required]
    public int SchoolId { get; set; }
}

我的观点:

@model IndexViewModel

@using (Html.BeginForm())
{
    <p>
        @Html.LabelFor(m => m.SchoolName)
        @Html.TextBoxFor(m => m.SchoolName)
        @Html.HiddenFor(m => m.SchoolId)
        @Html.ValidationMessageFor(m => m.SchoolId)
    </p>

    <p>
        <input type="submit" />
    </p>
}

@section scripts {
    <script>
        $(function () {
            // stop validator from ignoring hidden fields
            var validator = $('form').data('validator');
            validator.settings.ignore = "";

            // schoolname autocomplete
            $('#SchoolName').autocomplete({
                minLength: 1,
                source: [
                    { label: "ABC University", value: "1" },
                    { label: "Oklahoma University", value: "2" },
                    { label: "Texas University", value: "3" }
                ],
                select: function (e, ui) {
                    e.preventDefault();
                    $('#SchoolId').val(ui.item.value);
                    $('#SchoolName').val(ui.item.label);
                }
            });
        });
    </script>
}

提前致谢。


编辑

Sparky,这里是渲染的 HTML:

<form action="/" method="post">
    <p>
        <label for="SchoolName">SchoolName</label>
        <input id="SchoolName" name="SchoolName" type="text" value="" />
        <input data-val="true" data-val-number="The field SchoolId must be a number." data-val-required="The SchoolId field is required." id="SchoolId" name="SchoolId" type="hidden" value="" />
        <span class="field-validation-valid" data-valmsg-for="SchoolId" data-valmsg-replace="true"></span>
    </p>
    <p>
        <input type="submit" />
    </p>
</form>

【问题讨论】:

  • 我认为this 会帮助你。
  • 您应该向我们展示浏览器看到的表单的渲染 HTML。

标签: jquery asp.net-mvc-4 jquery-validate jquery-ui-autocomplete asp.net-mvc-validation


【解决方案1】:

错误消息仍然存在的原因是隐藏字段上没有正常的验证触发器。通常,对于单个字段,验证是在按键或模糊时触发的。该字段是隐藏的,因此当整个表单被验证时,只有提交按钮会触发隐藏字段的验证测试。

但是,您可以随时通过调用.valid() 方法以编程方式触发对任何字段的验证测试。

$('input[name="field"]').valid();  // force validation of 'input name="field"'

这是一个粗略的 jsFiddle 演示:http://jsfiddle.net/LJzfu/

  • 单击“提交”以在名为 field2 的隐藏输入上显示“必填”消息,该消息没有任何值。

  • 单击“开始”按钮以编程方式将一个值放入隐藏的输入中。该表单现在技术上将通过验证(在提交时),但错误消息仍然存在,因为我们没有验证触发器。

  • 在隐藏字段中输入值后立即调用.valid() 触发验证。这会强制对隐藏字段进行验证测试,然后隐藏错误消息(只要满足验证规则)。

【讨论】:

  • 工作就像一个魅力。不知道该调用什么方法,所以谢谢你指出我正确的方向!
猜你喜欢
  • 1970-01-01
  • 2011-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多