我正在ASP.NET MVC中编写应用程序。基本上我有一些页面需要用户身份验证。在用户登录时,我将用户行保留在会话中。所以在我的控制器中,我可以访问user.ID而无需进行额外的查询。
当项目处于调试模式时,我只能更改视图中的内容。不在控制器中。
如果我没有调试,我可以构建解决方案,并在不运行项目的情况下查看我所做的更改(使用F5)。 但是,它会丢失我拥有的所有会话变量。
所以基本上对于每一个无关紧要的控制器变化,我必须注销,登录才能看到我的变化。
这些是正常行为吗?
答案 0 :(得分:2)
是的,这是ASP.NET作为一个整体而不仅仅是MVC的正常行为。
如果需要重新编译(例如控制器或业务对象的更改),则在调试中运行时将进入新会话。如您所说,只有视图或页面的更改(不需要重新编译)才能让您在同一会话中看到更改。
善,
丹
答案 1 :(得分:2)
Controller.User.Identity.Name
访问用户ID。因此,您在会话对象中执行其他数据的查找,如果它不返回null,则使用它。如果它确实返回null,则根据用户ID再次查找其他信息并再次将其存储在会话中。这是我从Active Directory存储信息的方法,它运行良好。
答案 2 :(得分:1)
重新编译将清除所有当前会话数据。但是,它不会清除您的身份验证票证,它存储为cookie,因此您可以采取一些措施来避免这种情况。
如果您只需要访问用户ID,请使用User.Indentity.Name
如果您只需要用于显示目的的基本用户数据(例如用户名),则可以将其存储在会话cookie中。 警告:除非您加密Cookie数据,否则只会显示数据,不应信任纯文本Cookie数据。
如果您的用户数据比此更复杂,则通过使用Agent_9191建议的缓存的方法访问数据
将类似内容添加到基本控制器或扩展方法
protected UserData GetUserData() {
UserData user = HttpContext.Session["User"] as UserData;
if (user == null) {
user = UserDataRepository.GetUser(User.Identity.Name);
HttpContext.Session.Add("User", user);
}
return user;
}