我正在使用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 ....
<% } %>
但是这样做的对象不会在视图和控制器之间来回传递,而且当从视图返回到下一个动作时,我已经体验到它是空的。
有没有办法支持这个要求?
感谢您的帮助
答案 0 :(得分:1)
有几种方法可以解决这个问题。
首先;我可能决定将所有这些存储在会话对象中。我在这里假设模型非常大,所以我不希望它们存储在视图中,每次进入下一页时都会传回。
二;我可能会将它们存储在数据库中,如果向导没有完成,则将其作为后台进程的一部分删除。
我不会做的一件事就是将复杂的对象传递给每个视图。该视图应该真正需要了解一个宁静世界中的任何其他视图,所以我倾向于不这样做。
当然,这确实意味着您需要确定数据的存储位置。如果我有一个大的objcect然后我会选择数据库,如果相当小,那么我会选择会话对象。
正如您已经发现的那样,在每个视图中包含每个对象的所有数据可能会有问题。
但是,如果您决定这样做,那么View方式就是我要做的事情;
至少在更改属性或添加属性时,只需在局部视图中设置一次,而不是三次。此外,如果出现错误,您可以取消隐藏div并查看数据是否进入。
此外,每个字段都应具有ModelName.Property的id,以便控制器知道属性的位置。
<%= Html.TextBox("MyObject1.MyProperty1", value) %>
然后在控制器中你只需要做,然后从袖口开始;
[HttpPost]
public ActionResult MyAction1(ComplexObjectModel complexModel) {
答案 1 :(得分:0)
您可以查看MVC Futures Html.Serialize helper method,它允许您以类似于经典WebForms的方式将状态保持在控制器操作之间的隐藏字段中。