MVC通过几个视图传递值



我有一个登录视图供用户进行身份验证:在他插入他的用户名和密码之后,下一个视图有一个包含welcome, username消息的部分。我通过ViewBag.welcomeMsg传递这个信息,一切都很顺利。

当我进入另一个视图时,该部分不再包含消息,因为ViewBag.welcomeMsg是在第一个登录控制器中定义的,然后被擦除。

我不想写入每个控制器ViewBag.welcomeMsg = "...";

我的问题:有没有一种方法来传递像ViewBag这样的变量,它可以持续存在,并且可以从web应用程序的每个视图访问?就像一个静态场?

如果您只想在用户身份验证时在视图上显示欢迎信息,那么只需像这样修改视图:

@if (Request.IsAuthenticated)
{
    <text>Welcome, @User.Identity.Name</text>
}

可以检查TempData,这将是可用的,直到下一次视图渲染开始。这样你就可以从tempData中设置它为另一个viewbag。

这在很大程度上取决于您如何处理身份验证过程。例如,如果使用FormsAuthentication,则用户信息将存储在User.Identity.Name中。你可以从不同的上下文中访问User属性,如控制器,视图等。

另一方面,如果你自己处理身份验证,我的建议是做以下任何一件事(我写这篇文章是出于我的想法,所以如果我遗漏了一个属性的名称,请原谅我):

  1. 将用户名存储在cookie和Global中。asax handle PostAuthenticated事件,您将从cookie中读取用户名(如果已验证)。然后用genericidentity创建GenericPrincipal对象,并将其分配给Controller。用户

  2. 将信息存储在会话中(最简单的)并四处传递。然而,这样做的问题是,如果你有一个无会话控制器,在这种情况下,你不能依赖于这种方法。

很久以前我写过一篇关于使用角色和主体的文章,但您可以通过此解决方案了解如何处理问题http://mvcdeveloper.wordpress.com/2013/06/08/passing-user-roles-to-httpcontext-user/

最新更新