MVC通过多个视图传递值

时间:2014-06-18 09:08:28

标签: asp.net-mvc viewbag

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

当我前进到另一个视图时,该部分不再包含该消息,因为ViewBag.welcomeMsg在第一个登录控制器中定义并在此之后被删除。

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

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

3 个答案:

答案 0 :(得分:2)

如果您只是想在用户通过身份验证时在您的视图上显示欢迎消息,那么只需修改您的视图:

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

答案 1 :(得分:0)

可以检查TempData,它将在下一次视图渲染开始之前可用。这样你就可以将它从tempData设置到另一个视图包。

答案 2 :(得分:0)

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

另一方面,如果你自己处理身份验证,我给你的建议是做以下任何事情(我是从头脑中写这个,所以如果我错过了一个属性的名字,请原谅我):

  1. 将用户名存储在Cookie中,并存储在Global.asax句柄PostAuthenticated事件中,您将从cookie中读取用户名(如果已通过身份验证)。之后,使用GenericIdentiy创建GenericPrincipal对象并将其分配给Controller.User

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

  3. 我很久以前写过一篇关于与角色和校长合作的文章,但是你可以用这个解决方案来了解如何处理你的问题http://mvcdeveloper.wordpress.com/2013/06/08/passing-user-roles-to-httpcontext-user/