关于ASP.net MVC:ASP.net MVC – 请求范围的全局变量

ASP.net MVC - request-scoped global variable

我有一个值,我想在一个请求期间可用。我没有使用会话,因为这将使整个导航会话的值成为全局值。

所以我把这个值放到一个类的静态字段中。太好了,但是后来我发现这些字段更加全局化,也就是说,它们对整个应用程序都是固定的!这意味着导航会话之间可能存在随机交互。

所以问题是:有没有一个安全的地方,我可以放置一个全局变量,它将是

  • 整个请求的全局
  • 请求完成后重置
  • 不受同一用户或其他用户的任何其他请求影响

谢谢真知晶球

编辑我会详细说明的。我的母版页中有一段代码,在某些情况下我需要隐藏它,我只在控制器中知道这段代码。我想在控制器中设置一个静态变量,然后在母版页中查询它,但是现在我看到了一种更好的方法…


每个请求使用HttpContext.Items-a缓存存储。有关更多详细信息,请参阅4guysfromrolla上的这篇文章。

它在ASP.NET MVC中应该可以正常工作。您可能希望从基类(通过代码隐藏或使用inherits指令)派生母版页,并在基类上有一个受保护的方法,用于检查httpcontext.items和返回,例如,true/false,具体取决于您是否要显示条件代码。


TempData一直持续到下一个请求,如前所述。

但是还有另外两个字典适用于单个请求。

  • _ControllerViewPage.ViewData
  • Context.Items

从控制器到(母版)页的通信可能是更好的选择。


我们想到了两种方法:

  • 在设置此变量的位置创建一个基控制器,然后让所有控制器从中继承。
  • 使用tempdata——这里的问题是它在下一个请求中一直存在。但也许你知道,你可以通过使用一个guid键来确定,事实上,当你需要一个新的值的时候,你会得到它。
  • 我可能会选择1)。


    这是相对容易的,有几种方法可以做到这一点,这取决于你的网站是如何工作的。

    我将您的请求解释为您需要一个在请求期间存在的、对控制器、模型和主控形状可见的属性或变量。

    静态属性对ASP中的当前应用程序可见,这意味着一次连接了大量用户,但不一定全部连接。IIS将根据需要生成新的ASP应用程序。

    所以你可以这样做:

    您可以为母版页或代码隐藏页定制一个基类(因为所有的WebForms内容仍然有效)

    您可以有一个控制器的自定义基类。

    你可以从一个到另一个,所以:

    1
    2
    3
    4
    5
    6
    7
    8
    void Page_Init( object sender, EventArgs e )
    {
        var ctrl = this.ViewContext.Controller as MyBaseController;
        if ( ctrl != null )
        {
            MyLocalProp = ctrl.PropOnMyController;
        }
    }

    这将在控制器和主页面上按请求提供。


    在控制器(操作)中设置的母版页中访问数据的常见方法是通过VIEWDATA["thedatakey"]="someValue"。


    您是否查看了附加到控制器类的tempdata?这是一个简单的字典,通过一个请求来保存它的值,这意味着您的数据只能在控制器中访问,但这不应该是一个问题。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public class MyController : Controller
    {
      [AcceptVerbs(HttpVerbs.Get)]
      public ActionResult MyAction(string id)
      {
        this.TempData["Message"] ="YourData";
      }

      [AcceptVerbs(HttpVerbs.Post)]
      public ActionResult MyAction(string Id)
      {
        var myData = this.TempData["Message"];
      }
    }

    这对我有用。我只用它来显示警告信息和类似的东西。