Строго типизированный RadioButtonlist

Я хочу получить некоторые варианты (скажем, способ оплаты наличными, кредитной картой и т. д.) и привязать их к переключателям. Я считаю, что в MVC 3 нет RadioButtonList.

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


person Vivek    schedule 14.04.2011    source источник
comment
В моем блоге есть помощник по html, который может помочь jonlanceley.blogspot.com /2011/06/   -  person Jon    schedule 03.07.2011


Ответы (3)


Как всегда, вы начинаете с модели:

public enum PaiementMethod
{
    Cash,
    CreditCard,
}

public class MyViewModel
{
    public PaiementMethod PaiementMethod { get; set; }
}

затем контроллер:

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

    [HttpPost]
    public ActionResult Index(MyViewModel model)
    {
        return View(model);
    }
}

и, наконец, вид:

@model MyViewModel
@using (Html.BeginForm())
{
    <label for="paiement_cash">Cash</label>
    @Html.RadioButtonFor(x => x.PaiementMethod, "Cash", new { id = "paiement_cash" })

    <label for="paiement_cc">Credit card</label>
    @Html.RadioButtonFor(x => x.PaiementMethod, "CreditCard", new { id = "paiement_cc" })

    <input type="submit" value="OK" />
}

И если вам нужно какое-то более общее решение, которое инкапсулирует это в помощнике, вы можете найти ">следующий ответ полезен.

person Darin Dimitrov    schedule 14.04.2011
comment
Что ж, спасибо Дарин. Но мое требование состоит в том, чтобы связать переключатели со значениями базы данных и назначить пару «Текст/значение» переключателю, чтобы его можно было назначить свойству модели. - person Vivek; 14.04.2011
comment
идеально! давно искал это - person bcahill; 20.06.2012
comment
хороший ответ, сэкономил час ;) - person Drejc; 05.02.2013

Вот как мне нравится связывать RadioButtonLists. В модели представления есть коллекция моих строго типизированных объектов. Например, возможно, PaymentOptions — это кодовая таблица. Наряду с коллекцией есть SelectedPaymentOptionKey (или Selected*Id, если вы добавляете к своим первичным ключам префикс Id). Первоначально этот ключ будет иметь значение по умолчанию 0, но при обратной передаче он будет содержать значение выбранного элемента.

public class PaymentSelectionVM
{
  public ICollection<PaymentOption> PaymentOptions { get; set; }
  public int SelectedPaymentOptionKey { get; set; }
}

public ViewResult PaymentSelection()
{
  var paymentOptions = db.PaymentOptions.ToList();
  return View(
    new PaymentSelectionVM { 
      PaymentOptions = paymentOptions,

      //This is not required, but shows how to default the selected radiobutton
      //Perhaps you have a relationship between a Customer and PaymentOption already,
      //SelectedPaymentOptionKey = someCustomer.LastPaymentOptionUsed.PaymentOptionKey
      //  or maybe just grab the first one(note this would NullReferenceException on empty collection)
      //SelectedPaymentOptionKey = paymentOptions.FirstOrDefault().PaymentOptionKey 
    });
} 

Затем в представлении:

@foreach (var opt in Model.PaymentOptions)
{          
  @*Any other HTML here that you want for displaying labels or styling*@
  @Html.RadioButtonFor(m => m.SelectedPaymentOptionKey, opt.PaymentOptionKey)
}

m.SelectedPaymentOptionKey служит двум целям. Во-первых, он группирует радиокнопки вместе, так что выбор является взаимоисключающим (я бы посоветовал вам использовать что-то вроде FireBug для проверки сгенерированного html только для вашего собственного понимания. Замечательная вещь в MVC заключается в том, что сгенерированный HTML довольно простой и стандартный поэтому вам не составит труда в конечном итоге предсказать поведение ваших представлений.Здесь очень мало магии.). Во-вторых, он будет хранить значение выбранного элемента при обратной передаче.

И, наконец, в обработчике сообщений у нас есть доступный SelectedPaymentOptionKey:

[HttpPost]
public ActionResult PaymentSelection(PaymentSelectionVM vm)
{
   currentOrder.PaymentOption = db.PaymentOptions.Find(vm.SelectedPaymentOptionKey);
   ....
}

Преимущество этого перед использованием SelectListItems заключается в том, что у вас есть доступ к большему количеству свойств объекта в случае, если вы отображаете сетку/таблицу и вам нужно отобразить множество значений объекта. Мне также нравится, что в помощниках Html не передаются жестко закодированные строки, как в некоторых других подходах.

Недостатком является то, что вы получаете переключатели с одинаковым идентификатором, что на самом деле не очень хорошая практика. Это легко исправить, изменив на это:

  @Html.RadioButtonFor(m => m.SelectedPaymentOptionKey, opt.PaymentOptionKey, new { id = "PaymentOptions_" + opt.PaymentOptionKey})

Наконец, проверка немного причудлива с большинством всех методов переключателей, которые я видел. Если бы мне это действительно было нужно, я бы подключил некоторый jquery для заполнения скрытого SelectedPaymentOptionsKey всякий раз, когда нажимаются переключатели, и помещал [Required] или другую проверку в скрытое поле.

Другой обходной путь для проблемы проверки ненавязчивая проверка ASP.NET MVC 3 и переключатели

Это выглядит многообещающе, но у меня не было возможности проверить это: http://memoriesdotnet.blogspot.com/2011/11/mvc-3-radiobuttonlist-include.html

person AaronLS    schedule 11.07.2012

Вы должны привязать свои параметры к SelectList в ViewModel и установить для атрибута Selected значение true для ранее выбранного параметра.

person Mikhail    schedule 04.05.2011