2011-12-06 39 views
1

因此,我在我的项目中需要为实体框架实现MVC 3应用程序的用户注册系统。如何处理多个页面和实体的用户注册

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

  • 用户
  • 角色
  • 业务

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

我只是与MVC3/EF4.1我的脚湿。我最初的信息搜索让我看着一个存储库和工作单元来处理这个问题。但是,我看到一些资源说MVC3/Ef4.1并不需要存储库模式。

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

回答

3

我们的MVC3注册与类似实体(用户/个人/角色/机构隶属关系)跨越多个页面浏览(渐进式公开)。我不确定你是否完全掌握了Repository或UnitOfWork模式。这些是与持久性相关的模式,并且与会话无关,这是一种HTTP状态管理机制。

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

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

我们所做的是先收集用户&密码。流程是这样的:

  1. 用户输入电子邮件地址(表格1)
  2. 如果符合条件的,确认电子邮件发送给解决
  3. 用户确认使用电子邮件发送保密的电子邮件地址(表格2)
  4. 用户创建密码(形式3)
  5. 用户输入人物信息(形式4)
  6. 用户输入商业信息(形式5)

如果用户只完成了这些步骤的一个子集,我们可以使用数据库信息来确定注册过程中的下一步,并将它们汇集到该视图中,直到注册过程完成。

+0

有意思。我认为我们试图避免每一步都要写入数据库,以防止发生部分或放弃的注册事件。我只是想创建一个从一个页面到另一个页面的大型模型,然后每个页面都会填写与注册步骤相关的属性。 – Michael

+1

您仍然需要保存该模型以保持页面加载(假设您仍在思考会话)。如果您正在避免写入数据库以防止部分或放弃注册,为什么?如果你可以用很好的理由证明这一点,那么你可以在你的数据库中创建单独的实体,以便在每一步中存储数据。然后,当过程完成时,将数据移动到“真实”实体。这样,你不会因为会话占用服务器上的内存而结束会话。 – danludwig

+0

用完了字符空间。看到回答 – Michael

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(); 
} 
+0

Webforms闪回!你将如何在你的RegistrationViewModel上实现验证?如果您在UserInfo操作中提交它,则无效字段会导致ModelState.IsValid为false。另外,如何将RegistrationViewModel数据传递给BusinessInfo HttpGet操作方法? – danludwig

+0

你提出了很好的观点。所以推荐的实现方式是创建一个大型实体并提供提交/更新到该实体的视图模型? – Michael

+1

这是一种方法,但我不确定它是最简单的。就像我之前提到的,对于我们来说,我们不会重复实体数据以确保我们得到一切或一无所获。我们考虑过它,但找不到一个很好的理由来证明在保存到db之前等待注册完成。我们创建一个电子邮件条目,然后创建一个用户/密码条目,然后创建一个人员条目,然后创建一个关联条目。使用db中的数据,我们可以确定哪一步是进程中的下一步,哪些数据是陈旧/可以安全地清除。 – danludwig