I have the following model:
public class Person
{
public string Name { get; set; }
public string Gender { get; set; }
}
I want the
I took this idea and expanded on it. I pass a List<Dictionary<string,string>> to my editor template as added ViewData that I use to create the radio buttons. My template looks like this
@model string
@{
var buttons = (List<Dictionary<string, string>>)ViewData["Buttons"];
}
@foreach (var button in buttons) {
<label class="radio inline">
@Html.RadioButton(Html.NameForModel().ToHtmlString(), Model, Model == button["Value"], new { id = Html.IdForModel() }) @button["Label"]
</label>
}
this is what I'm passing to my EditorFor as additional ViewData
new { Buttons = new List<Dictionary<string, string>> { new Dictionary<string, string> { { "Label", "Commercial" }, { "Value", "Y" } }, new Dictionary<string, string> { { "Label", "Residential" }, { "Value", "N" } } } }
Granted I could add this to a ViewModel type and pass that to the View from my controller, however it was quicker to do it in the cshtml file.
I know it's ugly but the following might work:
@model string
@Html.RadioButton("", "F", Model == "F") Female
@Html.RadioButton("", "M", Model == "M") Male
The problem with the RadioButton helper is that if the first argument is null or empty it will always consider it as non checked thus making this helper inappropriate for editor templates.
Here's an excerpt from the MVC source code which illustrates what I mean:
bool isChecked = !string.IsNullOrEmpty(name) && string.Equals(htmlHelper.EvalString(name), b, StringComparison.OrdinalIgnoreCase);
As an alternative you could use a custom HTML helper to generate a list of radio buttons.