2010-09-26 50 views
0

我正在使用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 .... 
<% } %> 

但这样做对象不会在视图和控制器之间来回传递,并且从视图返回到下一个动作时遇到过这种情况。

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

感谢您的帮助

回答

1

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

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

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

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

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

正如您已经发现的,让每个视图中的每个对象的所有数据都有问题。然而,如果你决心做到这一点,那么查看方式就是我所要做的;

  1. 创建仅与在复 模型中的每个对象涉及 的局部视图。
  2. 在每个视图上,都包含部分视图的全部三个或多个 。
  3. 对于每个不是 的部分视图,视图中的活动参与者 将其置于隐藏 的div内。

至少在更改属性或添加属性时,只需在部分视图中设置一次而不是三次。此外,如果出现错误,您可以取消隐藏div并查看数据是否进入。

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

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

然后在控制器中,你只需做,而这关闭袖口;

[HttpPost] 
public ActionResult MyAction1(ComplexObjectModel complexModel) { 
+0

这是不是强制要去查看的方式...我去参加会议;) – Lorenzo 2010-09-27 15:42:40

0

你可以看看MVC期货Html.Serialize helper method它可以让你保持状态到控制器动作之间的隐藏字段以类似的方式经典的WebForms做的。

+0

完整_source code_样品在** github **与***良好的模式和做法***? – Kiquenet 2016-02-23 15:23:19