MVC 5 RadioButtonFor enum, the default enum value zero is always selected?

user4143172 picture user4143172 · Nov 23, 2014 · Viewed 26.8k times · Source

Say I have an enum:

public enum OrderStatusType
{
    Waiting = 0,
    Pending,
    Picked,
    Shipped,        
}

I generated the radio button list as follows.

@Html.RadioButtonFor(m => m.Status, OrderStatusType.Shipped, new {@checked = true})
@Html.RadioButtonFor(m => m.Status, OrderStatusType.Waiting)

But the Waiting is always selected. The output HTML is as below:

input type="radio" value="Shipped" name="Status" id="Status" checked="True"
input type="radio" value="Waiting" name="Status" id="Status" checked="checked"

Why is a "checked" attribute automatically added by MVC framework? Thanks.

The model:

public class OrderViewModel
{
    public OrderStatusType Status { get; set; }
}

The view:

@using WebApplication17.Controllers
@model WebApplication17.Models.OrderViewModel

@{
    ViewBag.Title = "Home Page";
}


@Html.RadioButtonFor(m => m.Status, OrderStatusType.Picked)
<span>@OrderStatusType.Picked</span>

@Html.RadioButtonFor(m=>m.Status, OrderStatusType.Pending)
<span>@OrderStatusType.Pending</span>

@Html.RadioButtonFor(m => m.Status, OrderStatusType.Shipped, new {@checked = true})
<span>@OrderStatusType.Shipped</span>

@Html.RadioButtonFor(m => m.Status, OrderStatusType.Waiting)
<span>@OrderStatusType.Waiting</span>

Answer

user3559349 picture user3559349 · Nov 23, 2014

Its selected because the value of your property Status is OrderStausType.Waiting (that's how binding works!).

Remove new {@checked = true} from the @Html.RadioButtonFor() method and in your controller, set the value of Status to OrderStausType.Shipped before you pass it to the view.

Note also you should use a <label> element rather that a <span> to associate the label with the radio button

@Html.RadioButtonFor(m => m.Status, OrderStausType.Picked, new {id = OrderStausType.Picked)
<label [email protected]>@OrderStausType.Picked</label>