我正在开发一个Intranet.NET MVC应用程序。我需要存储与每个经过身份验证的用户关联的位置,ID号等用户详细信息。
在.NET Webform应用程序中,我们用于在会话中保存登录用户的详细信息。但.NET MVC应用程序的最佳实践是什么?
答案 0 :(得分:1)
您仍然可以在MVC中使用会话状态,但这是不可取的。作为模式的MVC尊重HTTP的无状态。
一种替代方法是使用仅在内存中存储信息的Cache。这是一个包含更多信息的问题:Why would ASP.NET MVC use session state?
还有一个:Is it a good practice to avoid using Session State in ASP.NET MVC? If yes, why and how?
答案 1 :(得分:1)
有一些方法可以为这只猫提供皮肤,但我认为将个人资料信息附加到用户手中会是最优雅的。
您需要一个能够保留用户个人资料数据的个人资料提供程序。您可以使用SqlProfileProvider for SQL Server,但我建议您查看Microsoft ASP.NET Universal Providers ref:http://www.nuget.org/packages/Microsoft.AspNet.Providers
Scott Hanselman的一些无耻的复制和粘贴如下。假设您要跟踪用户的生日:
public class MyCustomProfile : ProfileBase
{
public DateTime? Birthdate {
get { return this["Birthdate"] as DateTime?; }
set { this["Birthdate"] = value; }
}
}
然后你在web.config中设置它:
<profile inherits="MyApp.Models.MyCustomProfile" defaultprovider="DefaultProfileProvider"></profile>
最后,您可以使用以下命令拉入当前用户的自定义配置文件:
var customProfile = HttpContext.Profile as MyCustomProfile;
DateTime? birthday = customProfile.Birthdate;
您必须设置数据存储,但这主要是需要完成的工作。您可以在Scott Hanselman的博客中找到完整的细节:http://www.hanselman.com/blog/IntroducingSystemWebProvidersASPNETUniversalProvidersForSessionMembershipRolesAndUserProfileOnSQLCompactAndSQLAzure.aspx
答案 2 :(得分:0)
我认为“在工作中使用正确的工具”的格言适用于此。只要正确使用,我认为在会话中存储数据没有任何问题。
MVC为短期状态(ModelState和TempData)提供了其他机制。如果那些满足您的需求,请使用它们。 TempData无论如何都在幕后使用SessionState(如this问题所示)。如果您真正需要的是数据在用户会话期间保持状态而不再存在,则SessionSate是执行该任务的好工具。
使用缓存也很好,但您需要管理缓存的过期/失效。我发现缓存对于非会话或用户相关的事物最有用,无论它们是更短还是更长寿。