【问题标题】:adding "name" attribute to CheckBoxFor将“名称”属性添加到 CheckBoxFor
【发布时间】:2012-07-23 04:53:02
【问题描述】:

我正在尝试向我的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>

【问题讨论】:

  • 它显示了什么吗?抛出错误?
  • 不,没有看到错误。它只是不更改复选框的名称。我发誓我以前做过……
  • 你有没有尝试在名称上不带@符号的情况下使用它
  • 作为参考,at (@) 符号通常仅用于“类”属性——它是一个转义字符,因此它可以使用保留字(类)作为属性名称。大多数其他常见的 HTML 属性不冲突,因此它们不需要转义字符。
  • @user547794 所以你在属性名称之后并且你希望属性的 N 是大写的。对吗?

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


【解决方案1】:

编辑09/07/2016

这行不通

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

但这会起作用

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

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


我认为这是不可能的。使用 HTML Helper 方法时,您不能更改复选框元素的 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);
}

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

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.CheckBox 方法,而不是使用Html.CheckBoxFor 辅助方法。

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 辅助方法。这也会为隐藏字段生成正确的名称。

【讨论】:

  • 这在 .NET 4.6 中仍然有效,“n”和“N”在语义上似乎很愚蠢。
  • 刚试过这个,它对我有用。但我不会使用,因为它似乎在 HTML5 规范中是被禁止的。并可能在未来造成麻烦。看到这个问题:stackoverflow.com/questions/26341507/…
【解决方案2】:

不能这样做。 CheckBoxFor 的全部意义在于自动生成 name。如果您想要自己的名字,请使用

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

【讨论】:

  • 这确实有效,并且是上述问题的最“正确”解决方案。谢谢。
【解决方案3】:

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

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

干杯!

【讨论】:

  • 在我的测试中添加了第二个名称字段,使输入表单无效。有时它确实有效,具体取决于名称!
  • @Kam - 在使用复杂的视图模型时,我必须定期执行此操作,这样名称最终不会变成一大串下划线和单词,并且从来没有问题创建了一个重复的名称属性......非常奇怪!我将不得不对此进行更多研究!
  • 你的救命稻草。正如 Tim 所说,CheckBoxFor 生成的名称有时不正确。
【解决方案4】:

名称中不需要@符号

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

【讨论】:

  • 嗯...试过这个,它仍然没有覆盖更改。如果我使用带有大写 N 的“名称”,它会在“名称”属性之外添加一个“名称”。为什么“名称”不覆盖现有名称?
  • @user547794 请给我看源代码渲染的html
  • @user547794 请帮我试试这个而不是“@name”尝试使用 id="help_practicalSuggestions"
  • 更改 ID 效果很好。好奇怪,为什么不能改名字?
  • @user547794 因为它优先考虑 id 而不是 name,我会更新我的答案
【解决方案5】:

尝试不使用@:

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

【讨论】:

    【解决方案6】:

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

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

    更新

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

    【讨论】:

      【解决方案7】:

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

      @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

      【讨论】:

        【解决方案8】:

        首先将过滤器添加到名为DisplayAttribute的模型中

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

        而且你可以使用标签作为模型

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

        【讨论】:

          猜你喜欢
          • 2011-07-25
          • 2021-08-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-06-04
          • 1970-01-01
          • 2023-03-03
          • 1970-01-01
          相关资源
          最近更新 更多