发布包含其他模型的对象

时间:2015-04-10 19:52:15

标签: c# controller asp.net-mvc-5 asp.net-routing

我一直在寻找一种方法来发布包含其他模型的模型的所有信息,我相信我可以将对象发送到我的视图中,并从我看过的50个示例中删除在,并可以使一切都很好。

这是我的模特,我正在谈论命名设备。

public int id { get; set; }
public String name { get; set; }
public ManufacturerItem manufacturerItem { get; set; }
public EquipmentType equipmentType { get; set; }
public SupportItem supportItem{ get; set; }
public Placement placement{ get; set; }
public Boolean status { get; set; }
public DateTime endOfLife{ get; set; }
public String notes{ get; set; }
public Purchase purchase{ get; set; }
public Boolean mes{ get; set; }
public DateTime reviewedDate{ get; set; }

根据我阅读的大量例子,我知道我可以这样渲染这些:

@Html.EditorFor(model => model.name)
@Html.EditorFor(model => model.manufacturerItem.model.name)

在其他研究中,我偶然发现了building forms for deep View Model graphs in ASP.NET MVC我可能会考虑使用的内容,但是在MVC中发布了2天。我使用的是MVC 5.所以我不知道今天的相对程度如何。

所以,让我们说我有另一个名为Book with {id,Title,Author}的模型,你可以编辑书名和作者。现在在这个模型中,在编辑时,我的控制器可以是这样的:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit([Bind(Include="ID,Title,Author)"] Book book)
{  ... -insert code- ...}

关于这个想法,我的控制器方法签名是什么?我是否将其他对象包含在自己的类型中?

我没有使用EF或linq-to-sql,因为我必须使用存储过程。所以我希望将所有这些信息整齐地打包并传递给存储库,该存储库将负责参数分配和存储过程的调用。

1 个答案:

答案 0 :(得分:1)

  

离开这个想法,我的控制器方法签名是什么   是为了设备模型?

您是否尝试过使用以下签名:

[HttpPost]
public ActionResult Edit(Equipment model)
{
    ...
}

顺便说一下,如果您的视图不包含允许编辑所有 Equipment模型对象图的属性的表单,您可以考虑使用仅包含属性的视图模型包含在表单中的输入字段中。然后在服务器上,您将使用id从后端获取相应的Equipment实例,仅更新从HTML表单发送的属性并将结果保存回来。

例如:

[HttpPost]
public ActionResult Edit(EquipmentViewModel model)
{
    Equipment equipement = backend.GetById(model.Id);
    // set the properties that are coming from the UI:
    equipment.name = model.Name;
    equipment.supportItem = model.SupportItem;
    ...

    // save the updated entity back
    backend.Update(equipment);
}

在此示例中,EquipmentViewModel将仅包含视图中具有相应输入字段的属性,以及用户应编辑的属性,而不包含整个域模型对象图。