Asp.net mvc 5 ASP.Net验证未触发隐藏文件

Asp.net mvc 5 ASP.Net验证未触发隐藏文件,asp.net-mvc-5,asp.net-validators,Asp.net Mvc 5,Asp.net Validators,我的页面上有3个必填字段,其中2个是隐藏的。隐藏字段值由jQuery根据下拉列表的选择填充。如果我只是将所有内容留空,以便所有字段都不填写,然后点击提交按钮,@Html.ValidationSummery()只列出1可见字段的错误。当隐藏字段也没有值时,如何让它显示错误 隐藏字段的代码: <li> <label for="SelectedProjects">Selected Projects:</label> <select size="

我的页面上有3个必填字段,其中2个是隐藏的。隐藏字段值由jQuery根据下拉列表的选择填充。如果我只是将所有内容留空,以便所有字段都不填写,然后点击提交按钮,
@Html.ValidationSummery()
只列出1可见字段的错误。当隐藏字段也没有值时,如何让它显示错误

隐藏字段的代码:

<li>
    <label for="SelectedProjects">Selected Projects:</label>
    <select size="1" id="SelectedProjects" name="SelectedProjects" multiple="multiple"></select> <button class="removeButton" data-codetype="Project" type="button">-</button>
    @Html.EditorFor(m => m.SelectedProjectCodes)
</li>

<li>
    <label for="SelectedTasks">Selected Tasks:</label>
    <select size="1" multiple="multiple" id="SelectedTasks" name="SelectedTasks"></select> <button class="removeButton" data-codetype="Task" type="button">-</button>
    @Html.EditorFor(m => m.SelectedTaskCodes)
</li>

默认情况下,jQuery验证(MVC使用)会忽略隐藏字段。您可以通过在页面加载时更改默认设置来调整此设置。一种方法可能是向隐藏字段添加一个类,以强制对其进行验证

<li>
    <label for="SelectedProjects">Selected Projects:</label>
    <select size="1" id="SelectedProjects" name="SelectedProjects" multiple="multiple"></select> <button class="removeButton" data-codetype="Project" type="button">-</button>
    <input class="force-validation" data-val="true" data-val-required="The SelectedProjectCodes field is required." id="SelectedProjectCodes" name="SelectedProjectCodes" type="hidden" value=""/>
</li>

这是故意的。向用户通知他们无法编辑的字段中的错误是没有意义的。如果您想验证字段,那么它应该是一个普通的文本框,或者用户可以控制的文本框。否则,由您的应用程序在不涉及用户的情况下确保其具有值。@ChrisPratt我不同意,该字段用于跟踪用户选择的多个选项,因此当隐藏字段为空时通知用户错误是有意义的,因为这表明他们没有进行一个或多个选择。我还认为这是出于设计,但大多数行为都有一种方法可以覆盖默认设计,知道如何做对我和其他人都有帮助。不。如果用户未能进行其他选择,则错误应出现在这些其他选择上,而不是隐藏字段上。@ChrisPratt除了用户输入的字段外,其他字段不是持久的。一旦他们选择了一个被锁定的项目,他们就会选择一个任务,它会清除,允许他们选择另一个任务,因此在该字段上运行验证将使他们总是失败。这是一个UI问题,应该这样处理。一个简单的事实是,验证错误需要转移到用户实际有权处理的地方。隐藏字段的全部要点是,它不应该被用户修改,因此在那里显示验证错误是没有用的。用户应该如何解决这个问题?
[HiddenInput(DisplayValue = false), Required]
public string SelectedProjectCodes { get; set; }

[HiddenInput(DisplayValue = false), Required]
public string SelectedTaskCodes { get; set; }
<li>
    <label for="SelectedProjects">Selected Projects:</label>
    <select size="1" id="SelectedProjects" name="SelectedProjects" multiple="multiple"></select> <button class="removeButton" data-codetype="Project" type="button">-</button>
    <input class="force-validation" data-val="true" data-val-required="The SelectedProjectCodes field is required." id="SelectedProjectCodes" name="SelectedProjectCodes" type="hidden" value=""/>
</li>
jQuery.validator.setDefaults({
    ignore: ":hidden:not(.force-validation)"
});