【问题标题】:Get the session variable once instead of every page获取会话变量一次而不是每一页
【发布时间】:2014-05-31 22:37:42
【问题描述】:

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

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

我使用@lang["Edit"] 或@lang["Create"] 代替标签

它有效,但我在每个视图中重复此代码

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

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

【问题讨论】:

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


【解决方案1】:

我不知道这是否适合您,因为您的问题混合了控制器和视图这两个术语。我将假设您所说的视图是指“控制器操作”。

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

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 之前运行。

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

【讨论】:

  • 我想我不清楚。现在变量 Lang 将无法在视图中访问,我的意思是它将是未知的。这将使我再次尝试在每个视图中接收它,我的问题是关于是否有什么东西或某个地方我编写了一次代码并使变量 lang 可以被所有视图访问
  • 为了更清楚,我将如何在您的代码中访问变量 Lang,因为我需要在视图中编写类似 @Lang["Create"] 的内容,它会以不同的方式显示 Create 一词根据用户选择的语言。
  • 谢谢,我必须对我的代码进行一些更改,但它有效,我希望我能投票回答,但我只是一个新用户。
  • 您可能无法投票,但您仍然可以将其标记为您问题的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-11
  • 1970-01-01
  • 2016-11-01
  • 1970-01-01
  • 2011-01-17
  • 1970-01-01
相关资源
最近更新 更多