复杂对象的MVC模型绑定Html.dropdownlist不起作用

时间:2015-07-23 10:21:06

标签: asp.net-mvc html.dropdownlistfor modelbinders

当我使用simle模型并在视图示例中传递模型的副本时 - 一切运行良好。

控制器中的

 AdvertisingStructure mc = context.AdvertisingStructures.Single(a => a.Id_show == id);
        if (mc == null)
        {
            return HttpNotFound();
        }

        return View(mc);

在视图中

 @model  Sciencecom.Models.AdvertisingStructure
 @Html.DropDownListFor(a => a.Owner.Id, new SelectList(owners, "id", "Name"))

所选列表的值

但是我在复杂对象中插入了这个模型,并在视图示例中传递了一个新的copy-html.dropdownlist停止工作(未选择列表的值)

新模式

   public class CompositeModelForEdit
{
    public AdvertisingStructure Structure;

    public IEnumerable<Side> Sides;

    public IEnumerable<Surface> Surfaces;

} 
控制器中的

  AdvertisingStructure mc = context.AdvertisingStructures.Single(a => a.Id_show == id);
        List<Surface> surfaces=new List<Surface>();
        foreach (var sides in mc.Sides)
        {
            foreach (var surface in sides.Surfaces)
            {
                surfaces.Add(surface);
            }
        }
        return View(new CompositeModelForEdit() { Sides = mc.Sides, Structure = mc,Surfaces = surfaces});

在视图中

@model  CompositeModelForEdit
     @Html.DropDownListFor(a => a.Structure.Owner.Id, new SelectList(owners, "id", "Name"))

有什么想法(字段输入显示值)?

1 个答案:

答案 0 :(得分:0)

您的模型不同,但在SelectList中您使用相同的属性 - Id,Name。我猜你的 AdvertisingStructure 类包含这些属性,但 CompositeModelForEdit 却没有。

编辑: 首先,不要使用这种复杂的视图模型,使用更简单的东西,例如:

public class OwnerViewModelForEdit
{
    public int OwnerId { get; set; }

    public string  Name { get; set; }

    //....
}

然后在您的GET操作中,您可以定义要在下拉列表中显示的项目列表:

IEnumerable<SelectListItem> ownersList =
            owners.Select(o => new SelectListItem() {Value = o.Id.ToString(), Text = o.Name});
ViewBag.Owners = ownersList;

return View(new OwnerViewModelForEdit(.........))

最后,在视图中定义您的下拉列表:

@Html.DropDownListFor(o => o.OwnerId, (IEnumerable<SelectListItem>)ViewBag.Owners)

然后在你的POST动作中将viewmodel数据绑定到你自己的所有者模型,你就完成了。

关于mvc下拉列表,Stackoverflow上有很多答案。如果你搜索一下,你会发现更好的建议。