12

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

@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>
4

8 回答 8

28

于2016 年 9 月 7 日编辑

这行不通

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

但这会起作用

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

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


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

在此处输入图像描述

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

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

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

所以它是类的调用MergeAttributeTagBuilder它看起来像这样

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)

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

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

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

于 2012-07-24T20:07:42.413 回答
16

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

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

干杯!

于 2013-08-21T21:36:47.113 回答
16

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

@Html.CheckBox("help_practicalSuggestions", Model.ProvidePracticalSuggestions)
于 2012-07-24T20:06:53.517 回答
1

您不需要名称中的 @ 符号

@Html.CheckBoxFor(
model => model.ProvidePracticalSuggestions, 
new { name = "help_practicalSuggestions" })
于 2012-07-24T19:50:47.320 回答
0

首先将过滤器添加到调用的模型中DisplayAttribute

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

您可以使用标签作为模型

@Html.LabelFor(model => model.PropertyName)
于 2013-11-06T05:54:04.797 回答
0

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

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

更新

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

于 2012-11-05T20:48:52.097 回答
0

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

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

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

呈现的 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

于 2013-03-31T16:52:10.743 回答
0

尝试不使用@:

@Html.CheckBoxFor(model => model.ProvidePracticalSuggestions, new { name = "help_practicalSuggestions" })
于 2012-07-24T19:50:32.203 回答