在基页的不同控制器之间保留数据

时间:2011-10-04 15:51:51

标签: asp.net-mvc c#-4.0 httpcontext

我不确定我在这里问正确的问题。

我有一个共享页面(母版页),可以为侧面菜单,页眉,页脚等调用几个部分页面。我所有的控制器都继承了一个BaseController。

现在,根据用户登录状态,我需要在所有这些部分页面中显示不同的数据,我认为在哪里检查用户是否登录的最佳位置 - BaseController。

这就是我的问题所在。我需要联系我的一个Web服务,看看用户是否已登录并获取一些相关数据。我只需要执行一次,并且由于所有控制器都继承自BaseController,因此每个部分页面调用都会导致Web服务调用。

显然,我不能只是粘贴一个私有bool变量isUserAuthenticated并检查标志,因为每个控制器都有一个基本控制器的新实例。

在传统的asp.net项目中,我会把这些东西放在HttpContext.Current.Items[]中并重复使用它,但我不能(以某种方式)在MVC中访问它。

我不能不从部分页面的基页继承,因为它们也可以独立调用,我也需要知道用户登录状态。

只调用一次函数的最佳方法是什么,或者更确切地说,只在一次调用期间存储bool值? - 在控制者之间可以访问..

人们如何做到这一点? 谢谢,对不起,我是mvc的新手!

2 个答案:

答案 0 :(得分:3)

您仍然可以使用HttpContext.Items,但您需要通过HttpContextBase实例访问它。

为了向后兼容,您可以将HttpContext打包在HttpContextWrapper中,就像这样

var context = new HttpContextWrapper(HttpContext.Current);

@ iamserious的answer above建议使用静态属性 - 我强烈不同意。设置静态变量是应用程序范围的,并且意味着每个用户都将使用相同的变量 - 所以所有用户都具有相同的登录数据。您希望按Session中的每个用户或Request的{​​{1}}每个用户进行存储。


我建议使用这种方法做一些事情,然后无论你在哪里调用ContextStash.GetInstance,你都会在同一个请求的生命周期内收到相同的实例 。您也可以使用相同的模式并使用HttpContext.Items代替HttpContext.Session

HttpContext.Items

答案 1 :(得分:0)

好吧,如果您只想在BaseController的多个实例中使用一个变量,请使用static关键字,如下所示:

public class BaseController : Controller
{
    private static bool isUserAuthenticated;
}

现在,无论您拥有多少BaseController实例,它们都将共享一个isUserAuthenticated变量,您将值更改为一个,您可以更改它。

这是大多数面向对象编程的基础,如果你不介意我说的话,你应该花一些时间来完成OOP的概念。