猿问

ASP.NETMVC中的多步骤注册过程问题(拆分视图模型,单个模型)

我有一个多步注册过程,由一个域层中的单个对象,它们具有在属性上定义的验证规则。

当域被分割到多个视图时,我应该如何验证域对象,并且在发布时必须在第一个视图中部分保存该对象?

我考虑过使用会话,但这是不可能的,因为这个过程很长,数据量很大,所以我不想使用会话。

我考虑将所有数据保存在内存中的关系数据库中(使用与主db相同的模式),然后将数据刷新到主db,但是出现了一些问题,因为我应该在使用主db和内存中数据库的服务(视图中请求)之间路由。

我正在寻找一个优雅而干净的解决方案(更准确地说是一个最佳实践)。

更新和澄清:

达林,谢谢你周到的回答,这正是我到现在为止所做的。但顺便提一句,我有一个包含很多附件的请求,我设计了一个Step2View例如,哪个用户可以异步地上传文档,但是这些附件应该保存在一个表中,该表与之前应该保存的另一个表具有引用关系。Step1View.

因此,我应该将域对象保存在Step1(部分),但我不能,因为部分映射到步骤1的视图模型的支持核心域对象无法保存,没有转换的道具Step2ViewModel.


www说
浏览 446回答 3
3回答

SMILET

我建议您使用jQuery在客户机上维护完整流程的状态。例如,我们有一个三步向导进程。提供了步骤1的用户有一个标记为“Next”的按钮。在单击Next时,我们发出一个Ajax请求,并创建一个名为Step 2的DIV,并将HTML加载到该DIV中。在步骤3中,我们在点击按钮时有一个标记为“已完成”的按钮,使用$.post Call发布数据。通过这种方式,您可以轻松地从表单POST数据构建域对象,如果数据有错误,返回有效的JSON,保存所有错误消息并在div中显示它们。请把台阶分开public class Wizard {   public Step1 Step1 {get;set;}   public Step2 Step2 {get;set;}   public Step3 Step3 {get;set;}}public ActionResult Step1(Step1 step){   if(Model.IsValid)  {    Wizard wiz = new Wizard();    wiz.Step1 = step;   //Store the Wizard in Session;   //Return the action  }}public ActionResult Step2(Step2 step){  if(Model.IsValid)  {    //Pull the Wizard From Session    wiz.Step2=step;  }}以上只是一个帮助你达到最终结果的演示。在最后一步中,您必须创建域对象并从Wizard对象中填充正确的值并将其存储到数据库中。
随时随地看视频慕课网APP
我要回答