我有一个像这样的控制器:
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
}
我已经看到了将值从过滤器传递到控制器的几种方法,但是所有这些方法都意味着在我的操作中使用额外的代码从过滤器中获取该值,而我并不想要这样。我想要一种方法,我可以获得所需的价值而不会改变我已经拥有或将要拥有的所有行动。
有没有办法解决这个问题?
我希望我的问题足够明确。提前谢谢!
答案 0 :(得分:1)
首先,变量不是全局变量,它是控制器上的实例变量。有点迂腐,是的,但那些是完全不同的东西。
其次,没有必要在会话中使用会话中的值在控制器上设置ivar,因为控制器已实例化并随每个请求一起处理。换句话说,无论如何,动作之间永远不会共享;每次调用新动作时,都必须重新设置ivar。
最后,当你可以使用过滤器时,由于最后一点,它是不必要的。如果您需要控制器操作中的会话变量,只需直接从该操作访问它。如果您需要将其传递给视图,可以在ViewBag
或视图模型中进行设置。