问题描述
假设我有这个模型:
公共类人{public bool IsApproved { get;放;}}
这是代码,我正在尝试使用 check
类型呈现 input
:
@Html.CheckBoxFor(x => x.IsApproved)@Html.CheckBox("IsApproved")
但是,结果是不同的:
//CheckBoxFor 结果<input data-val="true" data-val-required="IsApproved 字段是必需的."id="IsApproved" name="IsApproved" type="checkbox" value="true"><input name="IsApproved" type="hidden" value="false">//复选框结果<input id="IsApproved" name="IsApproved" type="checkbox" value="true"><input name="IsApproved" type="hidden" value="false">
如何以及为什么,第一个生成用于客户端验证的属性,而另一个没有?
更新:
交换@Html.CheckBoxFor
和@Html.CheckBox
的顺序后,标记元素的顺序没有改变.
CheckBox()
帮助器不渲染data-val
属性,因为表单已经渲染CheckBoxFor()
用于相同的属性.如果您交换顺序,data-val
属性将为 CheckBox()
呈现(而不是为 CheckBoxFor()
)呈现.>
我的理解是,在解析表单时,这会导致 jquery.validation.unobtrusive 出现潜在的(重复)问题.
控件的 html 助手在内部调用 HtmlHelper
的 GetUnobtrusiveValidationAttributes()
方法.来自源代码(我的重点)
仅当启用了不显眼的客户端验证时才呈现属性,然后仅当我们从未在此表单中为具有此名称的字段呈现验证.此外,如果没有表单上下文,则我们无法呈现属性(我们不必将它们附加到)
public IDictionaryGetUnobtrusiveValidationAttributes(字符串名称,ModelMetadata 元数据){
Let's say I have this model:
public class Person
{
public bool IsApproved { get; set; }
}
And whis this codes, I am trying to render input
with check
type:
@Html.CheckBoxFor(x => x.IsApproved)
@Html.CheckBox("IsApproved")
But, the results are different:
// CheckBoxFor result
<input data-val="true" data-val-required="The IsApproved field is required." id="IsApproved" name="IsApproved" type="checkbox" value="true">
<input name="IsApproved" type="hidden" value="false">
// CheckBox result
<input id="IsApproved" name="IsApproved" type="checkbox" value="true">
<input name="IsApproved" type="hidden" value="false">
How and why, the first one generates attributes for client-side validation, while the other didn't?
Update:
After swapping the order of @Html.CheckBoxFor
and @Html.CheckBox
, the order of markup elements didn't change.
The CheckBox()
helper does not render thedata-val
attributes because the form has already rendered CheckBoxFor()
for the same property. If you swap the order, the data-val
attributes would be rendered for CheckBox()
(and not for CheckBoxFor()
).
My understanding is this would cause a potential (duplication) problem with jquery.validation.unobtrusive when parsing the form.
The html helpers for controls internally call the GetUnobtrusiveValidationAttributes()
method of HtmlHelper
. From the source code (my emphasis)
public IDictionary<string, object> GetUnobtrusiveValidationAttributes(string name, ModelMetadata metadata)
{
这篇关于第一个 html helper 生成客户端验证属性,而第二个不生成的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!