【发布时间】:2015-08-26 21:58:55
【问题描述】:
背景: 我正在构建越来越多的 Web 应用程序,其中设计师/模板制作者决定添加“个人资料图片”和其他一些与用户相关的数据,当然只有在有人登录时。
作为大多数 ASP.NET MVC 开发人员,我使用视图模型为剃刀布局提供我需要显示的信息,这些信息来自存储库等。
通过使用显示用户名很容易
HttpContext.Current.User.Identity.Name
如果我想在这些页面上显示保存在我的后备数据存储中的信息怎么办? ApplicationUser 类中的自定义字段,例如业务单位名称或个人资料图片 CDN url。
(为了简单起见,假设我将身份框架与包含我的 ApplicationUsers 的实体框架(SQL 数据库)一起使用)
问题
你如何解决这个问题:
- 不污染视图模型/控制器树(例如,构建 BaseViewModel 或 BaseController 填充/提供此信息?
- 不必为这些详细信息的每个页面请求往返数据库?
- 如果用户未登录则不查询数据库?
- 当您无法使用 SESSION 数据时(因为我的应用程序经常在多个 Azure 实例上扩展 - read why this isn't possible here- 我对 SQL 缓存或 Redis 缓存不感兴趣。
我曾考虑过使用新的视图模型的局部 - 但这仍然会在每次页面加载时往返 SQL 数据库。会话数据现在是安全的,但是当在 azure 中扩展时,这也不是一种方法。知道什么是我最好的选择吗?
TLDR;
如果用户已登录(匿名访问 = 允许),我想在我的应用程序的每个页面上显示用户个人资料信息 (ApplicationUser)。如何在不查询每个页面请求的数据库的情况下显示此信息?如果没有 Session 类,我该如何做到这一点?在不构建基类的情况下如何做到这一点?
【问题讨论】:
-
我知道你肯定能做到。结帐:stackoverflow.com/questions/8369055/…
-
您可以使用自定义 IPrincipal 并在用户登录时向您的
FormsAuthenticationTicket添加其他值,因此可以在每个请求中从 cookie 中读取它们,而不是调用数据库(尽管添加图像cookie 可能不合适)。我不使用身份,但我相信它允许您使用声明来做到这一点。 -
是否每个页面都相同,如果是,您可以在
_Layout中设置外观。在_Layout中定义一个Div,它应该包含您的视图,并使用Ajax 加载PartialView内容。这样您只需加载一次配置文件详细信息 -
这些只解释了如何向用户对象添加新字段——这根本不是问题(我有这个工作)——我想要的只是在每个用户会话中获取该信息一次,而不是让一直查询数据库。 PartialView 解决方案不会成功,因为我们没有使用前端 mvvm 框架 - 每次加载页面时,都会重新创建/重新加载它。
标签: asp.net asp.net-mvc razor asp.net-identity-2