【问题标题】:First html helper generates client-side validation attributes, while the second one doesn't第一个 html 助手生成客户端验证属性,而第二个不生成
【发布时间】:2015-05-16 20:40:51
【问题描述】:

假设我有这个模型:

public class Person
{
    public bool IsApproved { get; set; }
}

而这个代码,我正在尝试用check 类型呈现input:

@Html.CheckBoxFor(x => x.IsApproved)
@Html.CheckBox("IsApproved")

但是,结果不同:

// 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">

如何以及为什么,第一个生成用于客户端验证的属性,而另一个没有?

更新:

交换@Html.CheckBoxFor和@Html.CheckBox的顺序后,标记元素的顺序没有改变。

【问题讨论】:

    标签: c# asp.net-mvc asp.net-mvc-4 razor unobtrusive-javascript


    【解决方案1】:

    CheckBox() 助手不会渲染data-val 属性,因为表单已经为相同的属性渲染了CheckBoxFor()。如果交换顺序,data-val 属性将为CheckBox() 呈现(而不是CheckBoxFor())。

    我的理解是,在解析表单时,这会导致 jquery.validation.unobtrusive 出现潜在(重复)问题。

    控件的 html 帮助器在内部调用 HtmlHelper 的 GetUnobtrusiveValidationAttributes() 方法。 From the source code(我的重点)

    仅在启用了不显眼的客户端验证时才呈现属性,并且仅当我们从未在此表单中对具有此名称的字段进行验证时才呈现属性。另外,如果没有表单上下文,那么我们就不能渲染属性(我们没有附加它们)

    public IDictionary<string, object> GetUnobtrusiveValidationAttributes(string name, ModelMetadata metadata)
    {
    

    【讨论】:

    • 感谢您的精彩解释。这是一个答案。
    • 嗨@Stephen,很抱歉再次发布。几天前,我发布了一个关于我遇到Asp.net MVC 的一个问题的问题。你有什么想法吗?你能看看吗。这是question。
    • @FarhadJabiyev,现在没时间,但我明天早上会看看 :)
    • :) 好的,抱歉再次打扰。谢谢。
    猜你喜欢
    • 2011-10-11
    • 2011-10-03
    • 1970-01-01
    • 1970-01-01
    • 2013-01-06
    • 2020-01-11
    • 1970-01-01
    • 1970-01-01
    • 2019-10-20
    相关资源
    最近更新 更多