我正在使用MVC4创建一个练习管理应用程序,但我不确定在会话的整个生命周期内保持登录用户数据的最佳方法,以便所有视图都可以访问它。控制器。
例如,我希望用户登录,然后从数据库下载用户数据,对于整个会话,我想维护用户模型(名称,数据库ID等),以便在整个网络中可以访问应用程序直到用户注销。
将数据存储在加密Cookie中的最佳方法是什么?或者有没有办法使用静态类?
目前我已经阅读了如此使用ViewModel Base类:
public abstract class ViewModelBase
{
public UserModel User { get; set; }
}
然后我的所有ViewModel都可以继承基类,从而提供对用户数据模型的访问:
public class AllEmployeesViewModel : ViewModelBase
{
public List<EmployeeModel> Employees { get; set; }
}
但是,如果在一个Controller操作中我设置了用户数据,那么只有在加载另一个Controller Action时它才会丢失。
对我来说,这似乎是浪费资源和将增加加载时间,以便在每个操作中不断从数据库下载用户数据。
这位新的网络程序员非常欢迎所有建议。如果我错过了任何重要细节,请提出要求,我会尽力回答。
答案 0 :(得分:4)
您应该查看SessionState以在用户的浏览器会话期间存储数据。
http://msdn.microsoft.com/en-us/library/vstudio/ms178581(v=vs.100).aspx
答案 1 :(得分:0)
我会以一种可供控制器访问的方式为类中的应用程序抽象Session。也许是一个Web应用程序核心类。
namespace MyApplication.Core
{
public class MySession
{
private const string _SessionName = "__MY_SESSION__";
private MySession() { }
public static MySession Current
{
get
{
MySession session =
(MySession)HttpContext.Current.Session[_SessionName];
if (session == null)
{
session = new MySession();
HttpContext.Current.Session[_SessionName] = session;
}
return session;
}
}
public UserModel CurrentUser { get; set; }
}
}
登录控制器逻辑路径中的某处
public void SomeLoginFunction(string userName,string password)
{
//DO AUTHENTICATION STUFF
MySession.Current.CurrentUser=aCurrentUserFromDB;
}
在您的基类中
public class ViewModelBase
{
public UserModel User { get{return {MySession.Current.CurrentUser;} }
}