MVC4: Two radio buttons for a single boolean model property
Asked Answered
B

3

65

I'm attempting to find the correct Razor syntax for mutually exclusive radio buttons that both reflect the value of a boolean property on my model. My model has this:

public bool IsFemale{ get; set; }

I would like to display this with two radio buttons, one "Male" and the other "Female," but everything I've tried so far has not reflected the actual value of the IsFemale property on the model. Currently, I have this:

@Html.RadioButtonFor(model => model.IsFemale, !Model.IsFemale) Male
@Html.RadioButtonFor(model => model.IsFemale, Model.IsFemale) Female

This seems to persist the value correctly if I change and update, but does not mark the correct value as checked. I'm sure this is something stupid, but I'm stuck.

Berthoud answered 9/5, 2012 at 14:40 Comment(3)
What is your app's culture? Are you using localized .net? Because I cannot repro your issue and because Darin's solution worked maybe this is some culture setting issue...Basia
I'm not currently setting the culture, so I assume it's using the machine default.Berthoud
Interesting... It's just strange because I'd also expect it work as you tried in fact it does in my repro...Basia
K
119

Try like this:

@Html.RadioButtonFor(model => model.IsFemale, "false") Male
@Html.RadioButtonFor(model => model.IsFemale, "true") Female

And here's the full code:

Model:

public class MyViewModel
{
    public bool IsFemale { get; set; }
}

Controller:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View(new MyViewModel
        {
            IsFemale = true
        });
    }

    [HttpPost]
    public ActionResult Index(MyViewModel model)
    {
        return Content("IsFemale: " + model.IsFemale);
    }
}

View:

@model MyViewModel

@using (Html.BeginForm())
{
    @Html.RadioButtonFor(model => model.IsFemale, "false", new { id = "male" }) 
    @Html.Label("male", "Male")

    @Html.RadioButtonFor(model => model.IsFemale, "true", new { id = "female" })
    @Html.Label("female", "Female")
    <button type="submit">OK</button>
}
Kill answered 9/5, 2012 at 14:47 Comment(5)
Yep, that works. That seems completely counter-intuitive to me, since the overload for RadioButtonFor specifies that parameter as object value. Thanks very much!Berthoud
Great Answer. Works for Label clicking too.Mcentire
in my case default is false and if i dont click radio to change then on submit i receive true. @Html.RadioButtonFor(m => m.IsWorkDefaultAddress, "true", new { id = "default-work" }) @Html.RadioButtonFor(m => m.IsWorkDefaultAddress, "false", new { id = "default-home" })Oft
If you want neither radio button selected then make IsFemale the nullable "bool?" and set IsFemale = null.Priggery
Why is a real bool value like @Html.RadioButtonFor(model => model.IsFemale, false, new { id = "male" }) not working?Tarryn
F
14

In MVC 6 (ASP.NET Core) this can also be achieved with tag helpers:

<label>
    <input type="radio" asp-for="IsFemale" value="false" /> Male
</label>
<label>
    <input type="radio" asp-for="IsFemale" value="true" /> Female
</label>
Fractious answered 5/12, 2017 at 15:35 Comment(0)
I
0

As far as September 2022.

Boolean radio button using: .NET Framework 4.7.2, MVC 5.2.7, Bootstrap 5.1.3.

Model

public class TheViewModel
{
    public bool IndustrialDegree { get; set; }
}

View

<div class="col-4 col-md-2 mb-3">
    @Html.Label("Industrial Degree", new { @class = "d-block form-label" })
    <div class="btn-group d-flex" role="group" aria-label="Basic radio toggle button group">
        @Html.RadioButtonFor(Model => Model.IndustrialDegree, true, new { @class = "btn-check", @id = "IndustrialDegreeTrue" })
        @Html.Label("IndustrialDegreeTrue", "Yes", new { @class = "btn btn-outline-primary" })

        @Html.RadioButtonFor(Model => Model.IndustrialDegree, false, new { @class = "btn-check", @id = "IndustrialDegreeFalse" })
        @Html.Label("IndustrialDegreeFalse", "No", new { @class = "btn btn-outline-primary" })
    </div>
</div>

Notice that I'm returning a pure boolean value to the controller.

Result

Radio button, using boolean values

It works in both directions.

This is what you'll see on the controller when debugging the view model.

false and true

Ishii answered 7/9, 2022 at 13:0 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.