如何获取会话变量值并在控制器变量中设置?

How to get a session variable value and set in a controller variable?

我有一个这样的控制器:

public class LoginController : Controller
{
    private Int32 _companyID;

    // My actions
}

这个变量 _companyID 应该(显然)包含公司的 ID,并且这个值当前在会话中。我想获取该值并设置在控制器变量上。

编辑:我使用这个变量是因为我必须从会话中检查关于这个值的一些事情,我不想在每个动作中都复制这个代码。相反,我只想检查我需要什么,在变量中设置这个值并在我的操作中使用它。

在 WebForms 上,我只需从页面加载事件中的会话中获取值即可完成。但是在 MVC 中,我不知道该怎么做。

我的第一个想法是在构造函数中获取这个值,类似这样:

public LoginController()
{
    _companyID = Convert.toInt32(Session["companyID"]);
}

但我发现无法在构造函数上访问会话(对我来说它是空的)。

然后我考虑使用过滤器,但我无法弄清楚如何在控制器变量中设置值。我试过这样:

public override void OnActionExecuting(ActionExecutingContext filterContext)
{
    base.OnActionExecuting(filterContext);
    Int32 _companyID = Convert.toInt32(HttpContext.Current.Session["idEmpresa"]);

    // I couldn't pass this value directly to the controller variable
}

我见过几种将值从过滤器传递到控制器的方法,但所有这些方法都意味着在我的操作中需要额外的代码才能从过滤器中获取该值,我不希望那样。我想要一种方法,可以在不改变我已经或将要采取的每项行动的情况下获得所需的价值。

有办法得到吗?

我希望我的问题足够清楚。提前致谢!

首先,该变量不是全局变量,它是控制器上的一个实例变量。有点迂腐,是的,但它们是完全不同的东西。

其次,无论如何,用会话中的值在控制器上设置 ivar 是没有意义的,因为控制器是随每个请求实例化和处理的。换句话说,无论如何,这永远不会在动作之间共享;每次调用新动作时,它都必须重新设置 ivar。

最后,虽然您可以使用过滤器,但由于最后一点,它是不必要的。如果您在控制器操作中需要会话变量,只需直接从该操作访问它即可。如果需要传递给视图,可以在ViewBag或视图模型上设置。