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

Сильно напечатанный RadioButtonlist

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

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

4b9b3361

Ответ 1

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

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" />
}

И если вы хотите получить более общее решение, которое инкапсулирует это в помощнике, вы можете найти следующий ответ.

Ответ 2

Вот как мне нравится привязывать 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 выполняет два задания. Во-первых, он группирует кнопки Radio вместе, чтобы выбор был взаимоисключающим (я бы посоветовал вам использовать что-то вроде FireBug для проверки сгенерированного html только для вашего собственного понимания. Замечательная вещь о MVC - это сгенерированный HTML, достаточно простой и стандартный поэтому вам не должно быть трудно в конечном итоге предсказать поведение ваших взглядов. Здесь очень мало волшебства.). Во-вторых, он будет удерживать значение выбранного элемента при обратной передаче.

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

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

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

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

  @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-including.html

Ответ 3

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