构建给定元素的数据验证属性列表

时间:2017-03-24 12:05:55

标签: asp.net-mvc razor unobtrusive-validation

当使用任何Input Extension Helper Methods时,如@Html.TextboxFor,模型中的任何Validation Attributes都会由Razor引擎自动生成(通过ClientValidationEnabled / UnobtrusiveJavaScriptEnabled )。

例如,采取以下情况正常

模型

[Required]
public string QuestionOne { get; set; }

查看

@Html.TextBoxFor(model => model.QuestionOne) 
@Html.ValidationMessageFor(model => model.QuestionOne)

生成标记

<input type="text" id="QuestionOne" name="QuestionOne" value=""
       data-val="true" data-val-required="The QuestionOne field is required." > 
<span class="field-validation-valid" data-valmsg-for="QuestionOne" data-valmsg-replace="true"></span>

在这种情况下,属性data-val="true"&amp;通过Unobtrusive验证获取data-val-required="The QuestionOne field is required.",并成功验证表单元素。

但是,出于可扩展性原因,我希望能够自己生成<input>元素,而不是使用TextBoxFor。所以我的观点现在看起来像这样:

<input type="textbox" 
       id="@Html.IdFor(m => m.QuestionTwo)"
       name="@Html.NameFor(m => m.QuestionTwo)" 
       value="@Model.QuestionTwo"
       data-val="true" data-val-required="Selection is Required" />

@Html.ValidationMessageFor(model => model.QuestionTwo)

在这种情况下,我只是手工重写data-val="true" (etc)来伪造验证属性输出,但这必须扩展到涵盖每一个案例。

Here's a running Demo in .NET Fiddle

问:我可以为给定元素构建/返回data-val-*属性列表吗?

1 个答案:

答案 0 :(得分:2)

您可以使用GetUnobtrusiveValidationAttributes()的{​​{1}}方法获取与特定媒体相关联的验证属性。

例如在视图中

HtmlHelper

注意@{ var attributes = Html.GetUnobtrusiveValidationAttributes("QuestionTwo"); } <input type="textbox" @foreach(var attr in attributes) { @:@attr.Key="@attr.Value" } id="@Html.IdFor(m => m.QuestionTwo)" .... /> 行会发出警告(缺少属性名称),但会正确运行

或者,您可以使用javaScript / jQuery添加属性

@:@attr.Key="@attr.Value"

我已经将DotNetFiddle here分叉以显示两个选项的工作代码。

虽然上面的代码显示了如何完成,但您不应该这样做。 <script type="text/javascript"> var attributes = @Html.Raw(Json.Encode(attributes)); var input = $('#QuestionTwo'); for(var i in attributes) { input.attr(i, attributes[i]); } </script> 方法执行大量您忽略的代码以确保正确的双向模型绑定,例如,首先检查HtmlHelper中的值,然后确定value中的值来确定ModelState属性ViewDataDictionary,并且只有先前的值不存在时才会使用属性的值(TextBoxFor displaying initial value, not the value updated from code的第二部分解释行为)。

除了value属性不正确之外,您为<input>显示的代码与仅使用@Html.TextBoxFor(m => m.Question2)生成的代码相同。我假设您的实际情况不同,但如果您无法使用TextBoxFor()并使用接受htmlAttributes的重载来生成您需要的html,那么正确的方法是创建您自己的{{1}方法(并使用HtmlHelper类和HtmlHelper命名空间中的现有方法)