MVC 3, Радио кнопки и модели - PullRequest
       1

MVC 3, Радио кнопки и модели

3 голосов
/ 30 декабря 2011

Учитывая, что у меня есть объект Model, такой как ...

public class MyModel
{
  public int SomeProperty { get; set; }
  public int SomeOtherProperty { get; set; } 

  public IList<DeliveryDetail> DeliveryDetails { get; set; }
}

public DeliveryDetail
{
   public string Description { get; set; }
   public bool IsSelected { get; set; }
}

, и я передаю его в View как этот ...

// Controller
public ActionResult Index()
{
  MyModel myModel = Factory.CreateModelWithDeliveryDetails(x);
  return View(myModel);
}

Как бы я рендерил / связывалнабор радиокнопок (в виде)?Использование следующего кода не отправляет данные обратно:

@foreach(var deliveryDetail in @Model.DeliveryDetails)
{
   @deliveryDetail.Description
   @Html.RadioButtonFor(x => deliveryDetail, false)
}

Ответы [ 2 ]

8 голосов
/ 30 декабря 2011

Выбор в списке переключателей является взаимоисключающим.Вы можете выбрать только одно значение.Поэтому привязка списка переключателей к свойству типа IEnumerable не имеет никакого смысла.Возможно, вам необходимо адаптировать модель представления к требованиям представления (которое в вашем случае отображает список переключателей, в котором можно сделать только один выбор).Если бы вы использовали список флажков, привязка к свойству IEnumerable имела бы смысл, так как вы можете установить несколько флажков.

Итак, давайте адаптируем модель представления к этой ситуации:

Модель:

public class MyModel
{
    public string SelectedDeliveryDetailId { get; set; }
    public IList<DeliveryDetail> DeliveryDetails { get; set; }
}

public class DeliveryDetail
{
   public string Description { get; set; }
   public int Id { get; set; }
}

Контроллер:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var model = new MyModel
        {
            DeliveryDetails = new[]
            {
                new DeliveryDetail { Description = "detail 1", Id = 1 },
                new DeliveryDetail { Description = "detail 2", Id = 2 },
                new DeliveryDetail { Description = "detail 3", Id = 3 },
            }
        };
        return View(model);
    }

    [HttpPost]
    public ActionResult Index(MyModel model)
    {
        // Here you will get the id of the selected delivery detail
        // in model.SelectedDeliveryDetailId
        ...
    }
}

Вид:

@model MyModel

@using (Html.BeginForm())
{
    foreach (var deliveryDetail in Model.DeliveryDetails)
    {
       @deliveryDetail.Description
       @Html.RadioButtonFor(x => x.SelectedDeliveryDetailId, deliveryDetail.Id)
    }
    <button type="submit">OK</button>
}
1 голос
/ 30 декабря 2011

Вам нужно другое свойство для объявленного значения: *

public class MyModel
{
  public int SomeProperty { get; set; }
  public int SomeOtherProperty { get; set; } 

  public IList<DeliveryDetail> DeliveryDetails { get; set; }

  public DeliveryDetail SelectedDetail { get; set; }
}

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

@foreach(var deliveryDetail in @Model.DeliveryDetails)
{
   @deliveryDetail.Description
   @Html.RadioButtonFor(x => x.SelectedDetail, deliveryDetail)
}

Чтобы это работало, DeliveryDetail должен быть Enum.

...