【问题标题】:Building a complex Object step by step. Where to save it?逐步构建复杂的对象。在哪里保存?
【发布时间】:2010-09-26 23:41:59
【问题描述】:

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

但是通过这种方式,对象不会在视图和控制器之间来回传递,当它从视图返回到下一个操作时,我体验到它是 null。

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

感谢您的帮助

【问题讨论】:

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


    【解决方案1】:

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

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

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

    我不会做的一件事是将复杂对象传递给每个视图。视图应该确实需要了解有关宁静世界中任何其他视图的任何信息,因此我倾向于不这样做。

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

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

    但是,如果您决心以 View 方式执行此操作,那么这就是我要做的;

    1. 创建一个局部视图来处理 仅与复合体中的每个对象 型号。
    2. 在每个视图上,包括所有三个,或 更多,部分视图。
    3. 对于不是 视图的积极参与者, 将它放在一个 div 中 隐藏。

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

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

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

    然后在控制器中您只需执行此操作,即插即用;

    [HttpPost]
    public ActionResult MyAction1(ComplexObjectModel complexModel) {
    

    【讨论】:

    • 查看方式不是强制性的...我参加了会议;)
    【解决方案2】:

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

    【讨论】:

    • github 中的完整源代码示例,带有良好的模式和实践?跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-30
    • 2020-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多