1

我的窗体上有一个隐藏字段,是必需的。当用户使用jQuery UI自动完成从文本框中选择一个值时,隐藏字段就会填充。我已经设置了我的表单验证器,不会忽略隐藏的字段,以便验证实际上可行。验证确实有效,但是当用户从自动完成中选择所需的选项时,然后填充隐藏的字段,验证消息将不会清除,并且会在表单发布之前显示。我是否需要手动调用$('form').validate()或者一旦隐藏字段被设置或有没有一种方法可以清除这个清除,而无需额外的JavaScript代码?ASP.NET MVC4 - 值设置后未隐藏字段验证

我的视图模型:

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> 
+0

我认为[this](http://stackoverflow.com/questions/7790478/client-side-validation-not-working-for-hidden-field-in-asp-net-mvc-3)会帮助你。 –

+0

您应该向我们展示浏览器看到的表单的_rendered_ HTML。 – Sparky

回答

1

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

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

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

这里是粗的jsfiddle演示:http://jsfiddle.net/LJzfu/

  • 点击“提交”,显示名为field2隐藏的输入,这是没有价值的“必需”的消息。

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

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

+0

工作就像一个魅力。不知道有什么方法可以打电话,所以谢谢你指点我正确的方向! – ryanulit