NET MVC 是/否带强绑定模型 MVC 的单选按钮

有人知道如何在 ASP.NET MVC 中将“是”/“否”单选按钮绑定到“强类型模型”的布尔属性吗。

模特

public class MyClass
{
public bool Blah { get; set; }
}

观景

<%@  Page Title="blah"  Inherits="MyClass"%>
<dd>
<%= Html.RadioButton("blah", Model.blah) %> Yes
<%= Html.RadioButton("blah", Model.blah) %> No
</dd>

谢谢

解决方案:

谢谢布莱恩的指导,但是这和他写的完全相反

<%@  Page Title="blah"  Inherits="MyClass"%>
<dd>
<%= Html.RadioButton("blah", !Model.blah) %> Yes
<%= Html.RadioButton("blah", Model.blah) %> No
</dd>
150419 次浏览

第二个参数被选中,所以当布尔值为 false 时,使用! 选择 no 值。

<%= Html.RadioButton("blah", !Model.blah) %> Yes
<%= Html.RadioButton("blah", Model.blah) %> No

如果你正在使用 MVC3和 Razor,你也可以使用以下软件:

@Html.RadioButtonFor(model => model.blah, true) Yes
@Html.RadioButtonFor(model => model.blah, false) No

或 MVC 2.0:

<%= Html.RadioButtonFor(model => model.blah, true) %> Yes
<%= Html.RadioButtonFor(model => model.blah, false) %> No

基于 Ben 的回答,我为 ID 添加了一些属性,这样我就可以使用标签了。

<%: Html.Label("isBlahYes", "Yes")%><%= Html.RadioButtonFor(model => model.blah, true, new { @id = "isBlahYes" })%>
<%: Html.Label("isBlahNo", "No")%><%= Html.RadioButtonFor(model => model.blah, false, new { @id = "isBlahNo" })%>

希望这个能帮上忙。

使用常规 HTML 在单选按钮周围添加标签标记也将解决“ label for”问题:

<label><%= Html.RadioButton("blah", !Model.blah) %> Yes</label>
<label><%= Html.RadioButton("blah", Model.blah) %> No</label>

单击文本现在选择适当的单选按钮。

下面是一个更完整的示例,出于可访问性的原因,使用 fieldset并将第一个按钮指定为默认按钮。如果没有 fieldset,则无法以编程方式确定单选按钮的整体用途。

模特

public class MyModel
{
public bool IsMarried { get; set; }
}

观景

<fieldset>
<legend>Married</legend>


@Html.RadioButtonFor(e => e.IsMarried, true, new { id = "married-true" })
@Html.Label("married-true", "Yes")


@Html.RadioButtonFor(e => e.IsMarried, false, new { id = "married-false" })
@Html.Label("married-false", "No")
</fieldset>

您可以向匿名对象添加一个 @checked参数,将单选按钮设置为默认值:

new { id = "married-true", @checked = 'checked' }

注意,可以通过用字符串值替换 truefalse来绑定到字符串。

最后,我把它打包成一个扩展方法,这样(1)我可以立即生成标签和单选,(2)这样我就不必为指定自己的 ID 而烦恼:

public static class HtmlHelperExtensions
{
public static MvcHtmlString RadioButtonAndLabelFor<TModel, TProperty>(this HtmlHelper<TModel> self, Expression<Func<TModel, TProperty>> expression, bool value, string labelText)
{
// Retrieve the qualified model identifier
string name = ExpressionHelper.GetExpressionText(expression);
string fullName = self.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name);


// Generate the base ID
TagBuilder tagBuilder = new TagBuilder("input");
tagBuilder.GenerateId(fullName);
string idAttr = tagBuilder.Attributes["id"];


// Create an ID specific to the boolean direction
idAttr = String.Format("{0}_{1}", idAttr, value);


// Create the individual HTML elements, using the generated ID
MvcHtmlString radioButton = self.RadioButtonFor(expression, value, new { id = idAttr });
MvcHtmlString label = self.Label(idAttr, labelText);


return new MvcHtmlString(radioButton.ToHtmlString() + label.ToHtmlString());
}
}

用法:

@Html.RadioButtonAndLabelFor(m => m.IsMarried, true, "Yes, I am married")

如果我可以把我的帽子扔进戒指,我认为有一个比现有的答案更干净的方式来重用单选按钮的功能。

假设在 ViewModel中有以下属性:

Public Class ViewModel
<Display(Name:="Do you like Cats?")>
Public Property LikesCats As Boolean
End Class

您可以通过可重用的 < em > 编辑器模板 公开该属性:

首先,创建文件 Views/Shared/EditorTemplates/YesNoRadio.vbhtml

然后将以下代码添加到 YesNoRadio.vbhtml:

@ModelType Boolean?


<fieldset>
<legend>
@Html.LabelFor(Function(model) model)
</legend>


<label>
@Html.RadioButtonFor(Function(model) model, True) Yes
</label>
<label>
@Html.RadioButtonFor(Function(model) model, False) No
</label>
</fieldset>

您可以通过在 观景中手动指定模板名称来调用该属性的编辑器:

@Html.EditorFor(Function(model) model.LikesCats, "YesNoRadio")

优点:

  • 在 HTML 编辑器中编写 HTML,而不是在代码后面追加字符串。
  • 保存 DisplayName 数据注释
  • 允许单击 Label 来切换单选按钮
  • 尽可能少的代码维护在表单中(1行)。如果渲染的方式有问题,就使用模板进行处理。