ASP.NET MVC是/否具有强绑定模型MVC的单选按钮


132

有谁知道如何将“是/否”单选按钮绑定到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>

谢谢

解:

感谢Brian的指导,但这与他写的相反。因此-

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

4
这些解决方案的“问题”(并且我在项目中使用的是Ben Cull样式)是您无法对其进行标签处理。两个单选按钮输入将具有相同的ID和名称,因此,如果您使用Html.LabelFor,它将链接到DOM中具有该ID的第一个单选按钮输入。就像我说的那样,我正在将这种解决方案用于单选按钮来表示一个布尔字段,我只是想让人们知道标签会有点奇怪。
Gromer 2011年

2
请参阅Jeff Bobish的答案,以了解如何优雅地解决标签问题。
勒内·

Answers:


74

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

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

198

如果您使用的是MVC 3和Razor,则还可以使用以下内容:

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

56

这是一个更完整的示例,fieldset出于可访问性的原因使用a 并将第一个按钮指定为默认按钮。如果没有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' }

请注意,您可以通过用true和替换false字符串值来绑定到字符串。


您实际上应该使用新的{id = Html.Id(“ married-true”)},以减少生成的ID前缀的潜在范围问题。
eoleary

26

我以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" })%>

我希望这有帮助。


7
通常,标签位于单选按钮之后。
Daniel Imms 2012年

6
在单选按钮周围放置标签是完全有效的。
Scott Baker

23

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

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

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


8

或MVC 2.0:

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

5

如果可以戴上帽子,我认为有比现有答案更干净的方法来重用单选按钮功能。

假设您在ViewModel中具有以下属性:

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

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

首先,创建文件 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>

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

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

优点:

  • 开始在HTML编辑器中编写HTML,而不是在后面的代码中附加字符串。
  • 保留DisplayName数据注释
  • 允许单击“标签”以切换单选按钮
  • 最少要保留的代码形式(1行)。如果呈现方式有问题,请使用模板。

很好,但是布尔的第三个选项呢?@ Html.RadioButtonFor(Function(Model)Model.IsVerified,True)<span>是</ span> @ Html.RadioButtonFor(Function(Model)Model.IsVerified,False)<span>否</ span> @ Html.RadioButtonFor (Function(Model)Model.IsVerified,Nothing))<span>待处理</ span>
JoshYates1980 '16

1

我最终将其包装到扩展方法中,因此(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")
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.