【发布时间】: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>
但是没有进行客户端验证;表单始终提交到服务器。
我错过了什么?我应该检查什么?
编辑
TextBoxFor 在 System.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;
}
我遇到的问题是 formContext.RenderedField(fullName) 返回 true,因此我的 input 元素中没有添加任何验证属性。
【问题讨论】:
-
在您显示的 html 中,客户端验证不需要
data-val-*属性!你是如何生成这个html的?它是否在<form>元素内? -
只是
@TextBoxFor(m => m.Username)和@ValidationMessageFor(m => m.Username) -
不应该有
data-val-required属性吗? -
刚刚设置了一个新的 MVC 项目(默认情况下启用了客户端验证),看起来我的
input元素没有设置验证属性。这是来自模板项目的 HTML。 ` ``` -
那么我只能建议它要么不在表单中,要么您在
@TextBoxFor(m => m.Username)之前还为该属性生成了另一个输入(可能是隐藏输入)
标签: asp.net-mvc validation razor