我正在尝试向我的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>
答案 0 :(得分:17)
编辑
这不起作用
@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
方法调用的
它正在为“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)