将"name"属性添加到CheckBoxFor

use*_*794 11 c# entity razor asp.net-mvc-3

我正在尝试为我添加"名称"属性CheckBoxFor,但无法让它工作.

@Html.CheckBoxFor(
model => model.ProvidePracticalSuggestions, 
new { @name = "help_practicalSuggestions" 
                })
Run Code Online (Sandbox Code Playgroud)

知道我在这里做错了什么吗?

呈现的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>
Run Code Online (Sandbox Code Playgroud)

Shy*_*yju 22

编辑2016年7月9日

这不行

@Html.CheckBoxFor(model => model.ProvidePracticalSuggestions,
                                              new { name = "help_practicalSuggestions"   })
Run Code Online (Sandbox Code Playgroud)

但这会奏效

@Html.CheckBoxFor(model => model.ProvidePracticalSuggestions,
                                              new { Name = "help_practicalSuggestions"   })
Run Code Online (Sandbox Code Playgroud)

诀窍是使用大写字母"N""Name"


我不认为这是可能的.name使用HTML Helper方法时,无法更改checkbox元素的属性.出于好奇,我查看了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);
}
Run Code Online (Sandbox Code Playgroud)

因此,它是调用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");
    }
}
Run Code Online (Sandbox Code Playgroud)

并且第一个If条件返回true,而内部if将不返回true,因为(我猜)nameAttributes集合中存在.所以它只会执行return声明.

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

public static MvcHtmlString CheckBox(
    this HtmlHelper htmlHelper,
    string name
)
Run Code Online (Sandbox Code Playgroud)

所以你的代码将成为

@Html.CheckBox("help_practicalSuggestions",Model.ProvidePracticalSuggestions)
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 这在.NET 4.6中仍然有效,并且在语义上似乎愚蠢的是,“ n”和“ N”使一切都变得不同。 (2认同)

Ser*_*sev 16

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

@Html.CheckBox("help_practicalSuggestions", Model.ProvidePracticalSuggestions)
Run Code Online (Sandbox Code Playgroud)


tkl*_*ves 16

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

@Html.CheckBoxFor(
model => model.ProvidePracticalSuggestions,
         new { @Name = "help_practicalSuggestions"})
Run Code Online (Sandbox Code Playgroud)

干杯!