获取会话变量一次而不是每个页面

时间:2014-04-16 20:52:45

标签: asp.net asp.net-mvc-4 session

我创建了一个XML文件作为我的语言字典,在基本控制器中,我将XML文件中的正确翻译加载到字典中,然后将其保存在Session中,并在每个View中加载Session,如下所示:

Dictionary<string, string> lang = (Dictionary<string, string>)Session["language"];

而不是我使用@lang [“Edit”]或@lang [“Create”]

的标签

它工作但我在每个视图中重复此代码

Dictionary<string, string> lang = (Dictionary<string, string>)Session["language"];

我有没有写过那段代码而不重复它? 顺便说一下,我知道全球化和本地化,但它不仅仅是翻译,因为我想将这些代码用于其他事情。

1 个答案:

答案 0 :(得分:0)

我不知道这是否适合您,因为您的问题混合了控制器和视图这两个术语。我会假设你的意思是“控制器动作”你所说的观点。

您可能想要做的是创建一个动作过滤器。因为您已经拥有一个非常简单的基本控制器,所以只需创建一个类似于以下的方法:

protected override void OnResultExecuting( ResultExecutingContext filterContext )
{
    base.OnResultExecuting( filterContext );

    if( filterContext.Result is ViewResult || filterContext.Result is PartialViewResult )
    {
        ViewBag.Lang = (Dictionary<string, string>)Session["language"];
    }
}

然后在您的视图中,通过ViewBag引用它。

@ViewBag.Lang["Create"]

OnResultExecuting方法将在为从基本控制器继承的任何操作生成ActionResult之前运行。

我添加了一些额外的代码以确保调用方法的基本版本,并确保在返回View或Partial View时只设置Lang属性。这样,如果您返回类似RedirectResult或RedirectToActionResult的内容,则不会产生任何从会话中获取字典的开销。