Подтвердить что ты не робот

Список перечислений MVC4 и список переключателей

Я видел несколько потоков на этом, но ни один из них не применим к MVC4, потому что метода/помощника расширения RadioButtonFor html не существует.

Скажем, у меня есть список перечислений - i.e Airlines:

public enum Airlines
{
   Unknown = 0,
   BritishAirways = 1,
   VirginAtlantic = 2,
   AirFrance = 3
}

Как я могу привязать это к списку кнопок Radio на моем представлении и иметь возможность получить выбранный элемент? Как насчет того, чтобы сказать "выбрать один элемент", если нет выбора?

4b9b3361

Ответ 1

Вы можете создать собственный шаблон редактора для перечисления Airlines, который отобразит список переключателей. В вашей модели у вас будет свойство типа Airlines и пометьте это свойство атрибутом Required и установите ErrorMessage = "select one item". Не забудьте включить проверку jQuery для проверки на стороне клиента, если вы этого хотите, обычно просто нужно добавить @Scripts.Render("~/bundles/jqueryval") в свой макет или представление. Если вы не используете проверку jQuery, вам нужно будет сделать свойство nullable на модели, потому что перечисления просто установлены на первое значение по умолчанию, поэтому MVC не будет считать его недопустимым. Помните, что если вы измените свойство на nullable, вам также необходимо будет изменить тип модели вашего шаблона редактора на нулевое значение.

UPDATE

Чтобы включить шаблон редактора для отображения списка переключателей для любого перечисления, измените шаблон на следующее:

@model Enum
@foreach (var value in Enum.GetValues(Model.GetType()))
{
    @Html.RadioButtonFor(m => m, value)
    @Html.Label(value.ToString())
}

ОРИГИНАЛ

Шаблон редактора, Airlines.cshtml, в каталоге Views\Shared\EditorTemplates:

@model MvcTest.Models.Airlines
@foreach (var value in Enum.GetValues(typeof(MvcTest.Models.Airlines)))
{
    @Html.RadioButtonFor(m => m, value)
    @Html.Label(value.ToString())
}

Модель:

public class TestModel
{
    [Required(ErrorMessage = "select one item")]
    public Airlines Airline { get; set; }
}

Методы действия:

public class HomeController : Controller
{
    [HttpGet]
    public ActionResult Index()
    {
        return View(new TestModel());
    }

    [HttpPost]
    public ActionResult Index(TestModel model)
    {
        if (ModelState.IsValid)
        {
            return RedirectToAction("Index");
        }

        return View(model);
    }
}

Вид:

@model MvcTest.Models.TestModel
@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>Index</h2>
@using (Html.BeginForm())
{
    @Html.EditorFor(m => m.Airline)
    <input type="submit" value="Submit" />
    @Html.ValidationSummary(false)
}

Ответ 2

Я предлагаю аналогичный подход к другим ответам, но со следующим шаблоном редактора; EnumRadioButtonList.cshtml, в каталоге Views\Shared\EditorTemplates:

@model Enum
@foreach (var value in Enum.GetValues(Model.GetType()))
{
    var id = TagBuilder.CreateSanitizedId(string.Format(
        "{0}_{1}_{2}", ViewData.TemplateInfo.HtmlFieldPrefix, Model.GetType(), value));
    <div>
        @Html.RadioButton(string.Empty, value, value.Equals(Model), new { id })
        @Html.Label(value.ToString(), new { @for = id })
    </div>
}

HTML id каждого переключателя должен быть уникальным. Поэтому вышеприведенный код префикс id с именем связанного свойства с помощью ViewData.TemplateInfo.HtmlFieldPrefix. Это гарантирует уникальный id, если модель содержит несколько свойств, которые использовали это перечисление, и если этот шаблон редактора использовался для каждого из них.

Сопровождающий label для каждого переключателя будет правильно установлен атрибут for. Это означает, что пользователь может выбрать радиокнопку, щелкнув текст ярлыка, намного больший и лучший клик, чем сам переключатель.

Для привязки модели MVC все переключатели имеют значение свойства HTML name, заданное для свойства, указанного в вызове EditorFor (Airline в этом сценарии).

Чтобы использовать его:

@Html.EditorFor(m => m.Airline, "EnumRadioButtonList")

Ответ 3

Что значит "RadioButtonFor" не существует? Я использую MVC4 и использую это в своем коде. Для списка вы можете установить несколько одинаковых имен

@Html.RadioButtonFor(x => x.Airlines, Airlines.Unknown)
@Html.RadioButtonFor(x => x.Airlines, Airlines.BritishAirways)
@Html.RadioButtonFor(x => x.Airlines, Airlines.VirginAtlantic)
@Html.RadioButtonFor(x => x.Airlines, Airlines.AirFrance)

они будут привязаны к модели, поэтому после обратной передачи вы увидите, что "Авиалинии" настроены на выбранный элемент, и при загрузке страницы будет выбран соответствующий переключатель.

Ответ 4

Я немного улучшил наивысший рейтинг asymptoticfault, чтобы отразить выбранные значения. Сохраните это как EnumRadioButton.cshtml для общих разделов EditorTemplates:

@model Enum
@foreach (var value in Enum.GetValues(Model.GetType()))
{
    if (Equals(Model, value))
    {
        @Html.RadioButtonFor(m => m, value, new {@checked = "checked"})
    }
    else
    {
        @Html.RadioButtonFor(m => m, value)
    }

    @Html.Label(value.ToString())
}

Использование:

@Html.EditorFor(item => Model.MyEnumType, "EnumRadioButton")