Как использовать Html.EditorFor для рендеринга переключателей в MVC3?

Здесь моя модель:

[Required]
[Display(Name = "I'm a:")]
public bool Sex { get; set; }

И мой шаблон редактора:

<div>
    @Html.LabelFor(model => model.RegisterModel.Sex)
    @Html.EditorFor(model => model.RegisterModel.Sex)
</div>

Однако это приведет к следующему:

<div>
    <label for="RegisterModel_Sex">Soy:</label>
    <input class="check-box" data-val="true" data-val-required="The Soy: field is required." id="RegisterModel_Sex" name="RegisterModel.Sex" type="checkbox" value="true" /><input name="RegisterModel.Sex" type="hidden" value="false" />
</div>

Как бы я сделал несколько приятных переключателей для мужчин и женщин? Какой тип данных должен был иметь моя модель?


Изменить:

Здесь мой новый обновленный код:

//Model:
    [Required]
    [Display(Name = "Soy:")]
    public Gender Sex { get; set; }
}

public enum Gender
{
    Male = 1,
    Female = 2
}

//Viewmodel:

<fieldset>
    <legend>Informacion Personal</legend>
    <div>
        @Html.LabelFor(model => model.RegisterModel.Nombre)
        @Html.EditorFor(model => model.RegisterModel.Nombre)
    </div>

    <div>
        @Html.LabelFor(model => model.RegisterModel.Apellido)
        @Html.EditorFor(model => model.RegisterModel.Apellido)
    </div>

    <div>
        @Html.LabelFor(model => model.RegisterModel.Sex)
        @Html.EditorFor(model => model.RegisterModel.Sex)
    </div>

    <div>
        @Html.LabelFor(model => model.RegisterModel.Carnet)
        @Html.EditorFor(model => model.RegisterModel.Carnet)
    </div>    
</fieldset>


//EditorTemplate:

@model GoldRemate.WebUI.Models.Gender

@{
    ViewBag.Title = "Gender";
}

<input type="radio" name="Sex" value="@Model" />

Когда я запускаю это, я получаю эту ошибку:

Элемент модели, переданный в словарь, имеет значение null, но этот словарь требует непустого элемента модели типа 'GoldRemate.WebUI.Models.Gender'.

Что вызывает это и как я могу показать значения моего перечисления в моей форме?

Ответ 1

Создайте перечисление вроде так:

 public enum Gender
 {
     Male = 1,
     Female = 2
 }

Я бы немного изменил вашу модель следующим образом:

 public Gender Sex { get; set; }

И тогда, на ваш взгляд, вы сделаете следующее:

 Html.EditorFor(x => x.RegisterModel.Sex);

Тогда у вас будет здесь EditorTemplate:

 ~/Views/Shared/EditorTemplates/Gender.cshtml

Которая имела бы такой контент:

@model EditorTemplate.Models.Gender // switch to your namespace

@Html.LabelFor(x => x, "Male")
@if(Model == EditorTemplate.Models.Gender.Male)
{
    @Html.RadioButtonFor(x => x, (int)EditorTemplate.Models.Gender.Male, new { @checked = "checked" });
}
else
{
    @Html.RadioButtonFor(x => x, (int)EditorTemplate.Models.Gender.Male);
}

@Html.LabelFor(x => x, "Female")
@if(Model == EditorTemplate.Models.Gender.Female)
{
    @Html.RadioButtonFor(x => x, (int)EditorTemplate.Models.Gender.Female, new { @checked = "checked" });
}
else
{
    @Html.RadioButtonFor(x => x, (int)EditorTemplate.Models.Gender.Female);
}

Итак, я смоделировал это в Visual Studio, и это работает так, как ожидалось. Попробуйте.