2011-12-30 65 views
3

鉴于我有一个模型对象像...MVC 3,单选按钮和模型

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; } 
} 

,我通过它通过对这样的观...

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

回答

8

单选按钮列表中的选择是互斥的。您只能选择一个值。因此,将单选按钮列表绑定到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

您需要发布值::

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。