【问题标题】:Chaining multiple classes in a MVC4 view在 MVC4 视图中链接多个类
【发布时间】:2012-09-02 00:25:11
【问题描述】:

假设我有一个这样的模型(从原来的简化):

public class Location
{
    public int ID { get; set; }
    public string BinNumber { get; set; }
}

public class Item
{
    public int ID { get; set; }
    public string Description { get; set; }
    public virtual Location Bin { get; set; }
}

public class LineOnPickList
{
    public int ID { get; set; }
    public virtual Item Item { get; set; }
}

在 LineOfPickList Create 视图中通常要做的事情是有一个下拉列表,其中列出了所有项目描述,并在单击 Create 时将所选项目放入新创建的 LineOnPickList 记录中。

然而,我需要做的是显示位置 BinNumbers 的下拉列表,但在新创建的 LineOnPickList 记录中仍然有与该位置关联的项目。

那该怎么做?

【问题讨论】:

  • ItemLocation 有什么关系?
  • 糟糕...我将 Item 类定义错了。现已更正...

标签: asp.net-mvc ef-code-first


【解决方案1】:

为您的下拉菜单定义视图模型

public class ItemViewModel
{
    public int ID { get; set; }
    public string BinNumber { get; set; }
}

然后在您的控制器操作中构建下拉列表数据,如下所示

public class CreateLineOnPickListViewModel
{
    public int ItemId { get; set; }
    public IEnumerable<ItemViewModel> Items { get; set; }
}

public ActionResult Create()
{
    var model = new CreateLineOnPickListViewModel();
    model.Items = db.Items
          .Select(i => new ItemViewModel { ID = i.ID, BinNumber = i.Bin.BinNumber });

    return View(model);
}

那么在你看来

@model CreateLineOnPickListViewModel

@Html.DropDownListFor(m => m.ItemId, new SelectList(Model.Items, "ID", "BinNumber"), "-")

然后你的控制器中的 post action 方法看起来像这样

public ActionResult Create(CreateLineOnPickListViewModel model)
{
    var item = new Item { ID = model.ItemID };
    db.Items.Attach(item);

    var lineOnPickList = new LineOnPickList { Item = item };

    db.SaveChanges();

    return View(model);
}

【讨论】:

  • 对不起,我不知道如何访问控制器内部的model。请告诉我这是怎么做到的。
  • 我的视图中一定缺少参考,除非我将 class CreateLineOnPickListViewModel 的定义放在我的模型文件中,否则它不会将 CreateLineOnPickListViewModel 视为@model 的有效选择。我应该把public ActionResult Create(...放在视图的哪个位置?
  • @davecove 将 CreateLineOnPickListViewModel 类放在您的 Models 文件夹中。当您在视图中定义 @model 时,请给出带有命名空间的类名。 public ActionResult Create( 部分应进入您的控制器。对此感到抱歉。
  • 好的,我用这个替换了我现有的[HttpPost] ActionResult Create,当我的 BinNumbers 出现在我视图的 DropDownList 中时,我可以选择一个,model.Items 返回到@ 987654333@ 中有一个元素,该元素始终为空。就像我的 DropDownList 选择的详细信息没有包含在回ActionResult Create 的帖子中。
  • @davecove 是的。这些值不会被发回。选定的选项值填充到ItemID 属性。
猜你喜欢
  • 1970-01-01
  • 2018-08-13
  • 1970-01-01
  • 2014-03-27
  • 1970-01-01
  • 2013-05-09
  • 2013-04-10
  • 2016-06-11
  • 1970-01-01
相关资源
最近更新 更多