逐步构建复杂的Object。在哪里保存?

时间:2010-09-26 23:41:59

标签: asp.net-mvc asp.net-mvc-2

我正在使用ASP.NET MVC。我的要求是通过像向导一样的逐步过程来构建一个复杂的对象(由其他对象构成的对象)。

每个依赖对象都应该建立在它的步骤之上,并且应该在它的步骤中进行验证。例如

public class ComplexObjectModel {
    public Object1 MyObject1 { get; set; }
    public Object2 MyObject1 { get; set; }
    public Object3 MyObject1 { get; set; }
}

由于没有内置的向导工具,我决定创建3个模型类和3个与这些模型绑定的强类型部分视图。

在我的伪向导的每一步中,我验证依赖模型对象并将复杂对象的属性设置为其引用。

我正在考虑以下列方式将复杂对象保存在ViewData / TempData中

在控制器动作中

[HttpPost]
public ActionResult MyAction1() {
    ComplexObjectModel com = (ComplexObjectModel)ViewData["ComplexObjectModel"];
    com.MyObject1 = new Object1();
    ViewData["ComplexObjectModel"] = com;
    return PartialView( "MyAction2", com.Object1 );
}

并在视图中

<% using (Html.BeginForm()) { %>
    <%= Html.Hidden("ComplexObjectModel", ViewData["ComplexObjectModel"]) %>

    ... view fields for Object1, Object n ....
<% } %>

但是这样做的对象不会在视图和控制器之间来回传递,而且当从视图返回到下一个动作时,我已经体验到它是空的。

有没有办法支持这个要求?

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

有几种方法可以解决这个问题。

首先;我可能决定将所有这些存储在会话对象中。我在这里假设模型非常大,所以我不希望它们存储在视图中,每次进入下一页时都会传回。

二;我可能会将它们存储在数据库中,如果向导没有完成,则将其作为后台进程的一部分删除。

我不会做的一件事就是将复杂的对象传递给每个视图。该视图应该真正需要了解一个宁静世界中的任何其他视图,所以我倾向于不这样做。

当然,这确实意味着您需要确定数据的存储位置。如果我有一个大的objcect然后我会选择数据库,如果相当小,那么我会选择会话对象。

正如您已经发现的那样,在每个视图中包含每个对象的所有数据可能会有问题。

但是,如果您决定这样做,那么View方式就是我要做的事情;

  1. 创建一个处理的局部视图 仅适用于复合体中的每个对象 模型。
  2. 在每个视图中,包括全部三个或 更多,部分观点。
  3. 对于不是的每个局部视图 视图中的积极参与者, 把它放在一个div中 隐藏。
  4. 至少在更改属性或添加属性时,只需在局部视图中设置一次,而不是三次。此外,如果出现错误,您可以取消隐藏div并查看数据是否进入。

    此外,每个字段都应具有ModelName.Property的id,以便控制器知道属性的位置。

    <%= Html.TextBox("MyObject1.MyProperty1", value) %>
    

    然后在控制器中你只需要做,然后从袖口开始;

    [HttpPost]
    public ActionResult MyAction1(ComplexObjectModel complexModel) {
    

答案 1 :(得分:0)

您可以查看MVC Futures Html.Serialize helper method,它允许您以类似于经典WebForms的方式将状态保持在控制器操作之间的隐藏字段中。