我有一个用户进行身份验证的登录视图:在他插入用户名和密码后,下一个视图会有一个带有welcome, username
消息的部分。我通过ViewBag.welcomeMsg
传递了这些信息,一切顺利。
当我前进到另一个视图时,该部分不再包含该消息,因为ViewBag.welcomeMsg
在第一个登录控制器中定义并在此之后被删除。
我不想写入每个控制器ViewBag.welcomeMsg = "...";
我的问题:有没有办法传递像ViewBag
这样的变量,该变量可以持续存在,并且可以从Web应用程序的每个视图中访问?像静态场一样?
答案 0 :(得分:2)
如果您只是想在用户通过身份验证时在您的视图上显示欢迎消息,那么只需修改您的视图:
@if (Request.IsAuthenticated)
{
<text>Welcome, @User.Identity.Name</text>
}
答案 1 :(得分:0)
可以检查TempData,它将在下一次视图渲染开始之前可用。这样你就可以将它从tempData设置到另一个视图包。
答案 2 :(得分:0)
这在很大程度上取决于您如何处理身份验证过程。例如,如果您使用FormsAuthentication
,则用户信息将存储在User.Identity.Name
中。您可以从控制器,视图等各种上下文中访问User
属性。
另一方面,如果你自己处理身份验证,我给你的建议是做以下任何事情(我是从头脑中写这个,所以如果我错过了一个属性的名字,请原谅我):
将用户名存储在Cookie中,并存储在Global.asax句柄PostAuthenticated
事件中,您将从cookie中读取用户名(如果已通过身份验证)。之后,使用GenericIdentiy创建GenericPrincipal对象并将其分配给Controller.User
将信息存储在会话中(最简单的)并传递它。但是,问题是如果你有一个无会话控制器,在这种情况下你不能依赖这种方法。
我很久以前写过一篇关于与角色和校长合作的文章,但是你可以用这个解决方案来了解如何处理你的问题http://mvcdeveloper.wordpress.com/2013/06/08/passing-user-roles-to-httpcontext-user/