如何处理多个页面和实体的用户注册

时间:2011-12-06 19:27:17

标签: asp.net-mvc-3 entity-framework-4.1

所以我在我的项目中需要为实体框架的MVC 3应用程序实现用户注册系统。

我有以下实体作为注册的一部分填写/需要填写:

  • 用户
  • 作用
  • 商业

旧的应用程序(我们称之为v1)使用类来处理注册过程以包含所有数据,然后在注册的每个步骤之后将类保存到会话

我刚刚用MVC3 / EF4.1弄湿了脚。我最初的信息搜索让我看到了一个存储库,以及处理这个问题的工作单元模式。但是,我看到一些消息来源说MVC3 / Ef4.1并不真正需要存储库模式。

所以我的问题是这个。我是否像在v1中那样创建用户注册,并且保存到会话的类现在在技术上是一个存储库,或者是否有更好的方法来利用MVC3 / EF4.1来处理使用跨越多个页面的流来注册新用户/视图。

2 个答案:

答案 0 :(得分:3)

我们的MVC3注册涵盖多个页面浏览(渐进式披露)与类似实体(用户/人/角色/与企业的关联)。我不确定你是否完全掌握了Repository或UnitOfWork模式。这些是与持久性相关的模式,并不与会话有任何关系,会话是HTTP状态管理机制。

我建议您在每个页面视图的末尾(当用户提交表单时)写入数据库,而不是在会话中累积所有数据。如果需要在链中将信息从一个视图传递到另一个视图,则可以使用控制器的TempData字典来存储实体键(TempData实际上在后台使用Session)。

如果用户未完成所有注册步骤,则使用此方法可能会导致数据库中的信息不完整。但是,它允许您让他们继续注册过程,而不必重新输入信息。然而,如果您正在使用会话,并且您的用户意外关闭了他们的浏览器窗口,那么所有会话数据都将丢失,并且用户将不得不重新开始。

我们所做的就是收集用户&密码第一。流程如下:

  1. 用户输入电子邮件地址(表单1)
  2. 如果符合条件,确认电子邮件将发送至地址
  3. 用户使用电子邮件密码确认电子邮件地址(表单2)
  4. 用户创建密码(表单3)
  5. 用户输入个人信息(表格4)
  6. 用户输入商家信息(表单5)
  7. 如果用户只完成了这些步骤的子集,我们可以使用数据库信息确定注册过程中的下一步,并将其汇总到该视图中,直到注册过程完成。

答案 1 :(得分:1)

评论回复中的字符用尽了。我能做这样的事吗?

[HttpGet]
public ActionResult UserInfo(RegistrationViewModel model)
{
    return View(model);
}

[HttpPost]
public ActionResult UserInfo(RegistrationViewModel model)
{
    return View("BusinessInfo",model);
}

[HttpGet]
public ActionResult BusinessInfo(RegistrationViewModel model)
{
    return View(model);
}

[HttpPost]
public ActionResult BusinessInfo(RegistrationViewModel model)
{
    return View("LicenseAgreement",model);
}

[HttpGet]
public ActionResult LicenseAgreement(RegistrationViewModel model)
{
    return View();
}