在MVC3中引用Session / Global用户变量的正确方法

时间:2012-07-02 16:02:19

标签: c# asp.net-mvc-3

所以我有一个在第一次用户登录时设置的Session变量

Session["ClientID"]

基本上这用于主题(因此ClientID将主题/品牌设置为显示在网站上)。查看应用代码

(Guid)Session["ClientID"] 

到处都是肮脏且容易出错,用于获取全局识别变量的最佳设计模式。所以我可以做到

this.CurrentClientID
所有MVC页面上的

或类似内容。从理论上讲,我可以使用提供此ID的Custom类重载Controller类,但我不确定如何将其公开给View。

任何指向最佳解决方案的指针都会感激不尽!

1 个答案:

答案 0 :(得分:2)

不知道你的意思是全局,但是ControllerBase类的扩展方法会使它在所有控制器中都可访问:

public static class ControllerExtensions
{
    public static Guid GetCurrentClientID(this ControllerBase controller)
    {
        return (Guid)controller.ControllerContext.HttpContext.Session["ClientID"];
    }
}

现在在每个控制器中都可以访问它:

public ActionResult Foo()
{
    Guid id = this.GetCurrentClientID();
    ...
}

如果您希望它更全局可用,请将其作为HttpContextBase类的扩展方法:

public static class ControllerExtensions
{
    public static Guid GetCurrentClientID(this HttpContextBase context)
    {
        return (Guid)context.Session["ClientID"];
    }
}

现在,无论您在何处访问HttpContext(几乎无处不在ASP.NET应用程序中),您只需使用扩展方法即可。例如,在视图中:

@Html.ActionLink("foo link", "foo", new { clientid = Context.GetCurrentClientID() })