将“name”属性添加到CheckBoxFor

时间:2012-07-24 19:43:22

标签: c# asp.net-mvc-3 razor entity

我正在尝试向我的CheckBoxFor添加“name”属性,但无法使其工作。

@Html.CheckBoxFor(
model => model.ProvidePracticalSuggestions, 
new { @name = "help_practicalSuggestions" 
                })

知道我在这里做错了吗?

呈现HTML:

<div>
      <input data-val="true" data-val-required="The Provide practical suggestions for implementing change, e.g. step-by-step best practices field is required." id="ProvidePracticalSuggestions" name="ProvidePracticalSuggestions" type="checkbox" value="true" /><input name="ProvidePracticalSuggestions" type="hidden" value="false" />
       <span class="field-validation-valid" data-valmsg-for="ProvidePracticalSuggestions" data-valmsg-replace="true"></span>
       <label for="ProvidePracticalSuggestions">Provide practical suggestions for implementing change, e.g. step-by-step best practices</label>
</div>

8 个答案:

答案 0 :(得分:17)

09/07/2016

编辑

这不起作用

@Html.CheckBoxFor(model => model.ProvidePracticalSuggestions,
                                              new { name = "help_practicalSuggestions"   })

但这会有效

@Html.CheckBoxFor(model => model.ProvidePracticalSuggestions,
                                              new { Name = "help_practicalSuggestions"   })

诀窍是在"N"

中使用大写字母"Name"

我认为这不可能。使用HTML Helper方法时,无法更改checkbox元素的name属性。出于好奇,我查看了MVC源代码并在InputHelper方法中发现了一些有趣的东西,该方法是从CheckBoxHelper方法中调用的CheckBoxFor方法调用的

enter image description here

它正在为“type”,“name”和“value”调用MergeAttribute方法。此代码仅适用于 Checkbox 元素

编辑:查看MergeAttribute方法,这就是它的方式

public void MergeAttribute(string key, string value)
{
    bool flag = false;
    this.MergeAttribute(key, value, flag);
}

所以它正在调用MergeAttribute类的TagBuilder,它看起来像这个

public void MergeAttribute(string key, string value, bool replaceExisting)
{
    if (!string.IsNullOrEmpty(key))
    {
        if (replaceExisting || !this.Attributes.ContainsKey(key))
        {
            this.Attributes[key] = value;
        }
        return;
    }
    else
    {
        throw new ArgumentException(CommonResources.Argument_Cannot_Be_Null_Or_Empty, "key");
    }
}

第一个If条件返回true,内部if不会返回true,因为(我猜)name集合中存在Attributes。所以它只会执行return语句。

解决方案:您可以使用Html.CheckBoxFor方法,而不是使用Html.CheckBox辅助方法。

public static MvcHtmlString CheckBox(
    this HtmlHelper htmlHelper,
    string name
)

所以你的代码将成为

@Html.CheckBox("help_practicalSuggestions",Model.ProvidePracticalSuggestions)

第一个参数是输入元素所需的名称。

另外,正如其中一个other answer中所述,如果您使用new { @Name="MyCustomName"},它将生成带有您传递的名称的复选框元素。但是它不会生成具有此名称的隐藏输入字段。您的隐藏字段仍将与您的模型属性名称具有相同的名称。 CheckboxFor辅助方法通常generate the hidden field用于在此隐藏字段中存储所选/未选中复选框的值。因此,重要的是您应该将两个字段(复选框和它的关联隐藏字段)名称相同。

所以最好的解决方案是使用Html.CheckBox辅助方法。这也将为隐藏字段生成正确的名称。

答案 1 :(得分:15)

不能这样做。 CheckBoxFor的重点是自动生成name。如果您想要自己的名字,请使用

@Html.CheckBox("help_practicalSuggestions", Model.ProvidePracticalSuggestions)

答案 2 :(得分:14)

实际上,您所要做的就是使用“@Name”(带有大写的N),如下所示,一切都应该正常! :)

@Html.CheckBoxFor(
model => model.ProvidePracticalSuggestions,
         new { @Name = "help_practicalSuggestions"})

干杯!

答案 3 :(得分:1)

您不需要名称中的@符号

@Html.CheckBoxFor(
model => model.ProvidePracticalSuggestions, 
new { name = "help_practicalSuggestions" })

答案 4 :(得分:0)

尝试不使用@:

@Html.CheckBoxFor(model => model.ProvidePracticalSuggestions, new { name = "help_practicalSuggestions" })

答案 5 :(得分:0)

只需创建一个临时变量并将其传递给lambda表达式。

@{var help_practicalSuggestions = Model.ProvidePracticalSuggestions; } 
@Html.CheckBoxFor(model => help_practicalSuggestions)

<强>更新

Serg Rogovtsev实际上是对的。辅助函数的'... For'版本会自动为您提供name属性。

答案 6 :(得分:0)

在CheckBoxFor帮助器中,我们使用表达式将控件绑定到property。属性名称用于设置控件的name属性。

@Html.CheckBoxFor(model => model.IsMarried)

当我使用复选框绑定模型属性时,它会使用属性名称本身分配控件的name属性,如下所示:

呈现HTML:

<input id="IsMarried" name="IsMarried" type="checkbox" value="true" />
<input name="IsMarried" type="hidden" value="false" />

您可以使用CheckBox助手来提供name属性,或者您可以创建自己的自定义助手方法,您可以根据需要分配属性。

有关更多信息,请访问:

http://20fingers2brains.blogspot.in/2013/02/html-checkboxfor-helper-in-mvc3-razor.html

答案 7 :(得分:0)

首先将过滤器添加到名为DisplayAttribute

的模型中
[DisplayAttribute(Name = "Some Text")]
public bool IsChecked { get; set; }

您可以使用Label for model

@Html.LabelFor(model => model.PropertyName)