【发布时间】:2015-02-27 22:45:47
【问题描述】:
根据我的研究,在 MVC 中编写复选框的正确方法如下。
@Html.CheckBoxFor(m => m.RememberMe)
@Html.LabelFor(m => m.RememberMe)
这将渲染一个复选框,为该复选框渲染一个标签,并使标签可点击,这意味着点击标签也会切换复选框。
但是对于单个视图模型字段有多个复选框的情况呢? (例如,每个复选框可能代表一个整数值中的一个位。)或者,更好的是,单选按钮呢,总是有多个选项与同一个字段相关联?
在这些情况下,上面的代码似乎存在问题。要么不是所有元素都与同一个字段相关联,要么会呈现具有相同 ID 的多个元素。
我已经研究了一段时间了。我找到了很多解决方案;但是,它们似乎都没有可点击的标签,或者它们需要一堆自定义和/或非标准编码。有些人完全避免使用 RadioButtonFor/LabelFor,而是选择对原始 HTML 进行编码。
编写原始 HTML 代码很好,但 MVC 的设计者没有预料到我们可能需要多个单选按钮用于同一字段吗?而且,如果他们这样做了,他们打算如何对其进行编码?
编辑:
在对此进行了更多研究之后,下面的代码是我发现的对单选按钮进行编码的最佳方式。此代码假定我已为每个单选选项定义了一个枚举。
@Html.RadioButtonFor(m => m.Gender, Gender.Male, new { id = "gender-male" })
@Html.LabelFor(m => m.Gender, Gender.Male.ToString(), new { @for = "gender-male" })
@Html.RadioButtonFor(m => m.Gender, Gender.Female, new { id = "gender-female" })
@Html.LabelFor(m => m.Gender, Gender.Female.ToString(), new { @for = "gender-female" })
也许这是我能预料到的最好的,但它仍然让我有点困扰。
为什么需要对 ID 等基本内容进行如此多的自定义?再说一次,微软没有预料到我们会想要多个单选按钮与同一个字段相关联吗?
如果枚举名称与我想要的单选按钮标签的描述不同,这种方法似乎不支持字段属性,例如
[Display(Name = "")]。
(我猜对多个复选框的正确处理将推迟到另一个问题。)
【问题讨论】:
-
在我看来,
RadioButtonFor应该有像DropDownListFor这样的重载,我可以在其中传递项目列表,并且每个项目的单选按钮都将使用可点击的标签生成。 -
@th1rdey3:我不确定 DropDownListFor。也许RadioButtonListFor?还有such a component has been written,如果您想使用第三方选项。但我不明白为什么微软认为不需要它。
-
现在你一个人在谈论......关于你找到的解决方案的问题,我认为这是......同时。
-
只是指向 AmirHosseinMehrvarzi 删除了他所有的 cmets。就是这样。
-
@JonathanWood 顺便说一句,你在 SO 1 月 1 日 2:56 做了什么?你为什么不庆祝新年? :)
标签: asp.net-mvc checkbox radio-button radiobuttonfor