【问题标题】:MVC Model binding of complex objects Html.dropdownlistfor not work复杂对象的 MVC 模型绑定 Html.dropdownlistfor 不起作用
【发布时间】:2015-07-23 10:21:05
【问题描述】:

当我使用简单模型并在视图示例中传递模型的副本时,一切正常。

在控制器中

 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"))

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

【问题讨论】:

  • 您显示的代码看起来没有任何问题。无论如何,第一个示例是一个复杂模型 (AdvertisingStructures.Owner.ID)。您是否检查过 Owner.ID 属性已正确分配并且其值与选项之一匹配?

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


【解决方案1】:

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

编辑: 首先,不要使用这么复杂的viewmodel,使用更简单的,例如:

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 数据绑定到您各自的 Owner 模型,然后您就完成了。

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

【讨论】:

  • 您能提供任何解决方案吗?或者如何在没有复杂模型的情况下使用2个模型在一个视图中进行绑定?
  • 我编辑了答案,以便您可以通过代码着色看到它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-25
  • 2015-03-28
  • 2017-07-16
  • 2023-03-18
相关资源
最近更新 更多