ASP.net MVC - request-scoped global variable
我有一个值,我想在一个请求期间可用。我没有使用会话,因为这将使整个导航会话的值成为全局值。
所以我把这个值放到一个类的静态字段中。太好了,但是后来我发现这些字段更加全局化,也就是说,它们对整个应用程序都是固定的!这意味着导航会话之间可能存在随机交互。
所以问题是:有没有一个安全的地方,我可以放置一个全局变量,它将是
- 整个请求的全局
- 请求完成后重置
- 不受同一用户或其他用户的任何其他请求影响
谢谢真知晶球
编辑我会详细说明的。我的母版页中有一段代码,在某些情况下我需要隐藏它,我只在控制器中知道这段代码。我想在控制器中设置一个静态变量,然后在母版页中查询它,但是现在我看到了一种更好的方法…
每个请求使用
它在ASP.NET MVC中应该可以正常工作。您可能希望从基类(通过代码隐藏或使用inherits指令)派生母版页,并在基类上有一个受保护的方法,用于检查httpcontext.items和返回,例如,true/false,具体取决于您是否要显示条件代码。
但是还有另外两个字典适用于单个请求。
- _
Controller 、ViewPage 、.ViewData 。 Context.Items
从控制器到(母版)页的通信可能是更好的选择。
我们想到了两种方法:
我可能会选择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"]; } } |
这对我有用。我只用它来显示警告信息和类似的东西。