当使用任何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)
来伪造验证属性输出,但这必须扩展到涵盖每一个案例。
问:我可以为给定元素构建/返回data-val-*
属性列表吗?
答案 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
命名空间中的现有方法)