我有一个值,我想在单个请求期间成为vaild。我没有使用Session,因为这会使整个导航会话的值全局化。
所以我把它放在一个类的静态字段中。很棒,但后来我发现这些字段更加全局化,也就是说,它们可以保留整个应用程序!这意味着导航会话之间可能存在随机交互。
所以问题是:是否有一个安全的地方我可以放一个全局变量,这将是
由于 真知晶球
EDIT 我会详细说明。我的母版页中有一段代码,我需要在某些条件下隐藏,我只知道它在控制器中。我想在控制器中设置一个静态变量,然后由主页面查询,但现在我看到可能有更好的方法......
答案 0 :(得分:24)
使用HttpContext.Items
- 每请求缓存存储。查看4guysfromrolla上的this article了解更多详情。
它应该在ASP.NET MVC中正常工作。您可能希望从基类派生主页(通过代码隐藏或使用Inherits指令),并在基类上有一个受保护的方法,用于检查HttpContext.Items并返回,例如: true / false取决于您是否要显示条件代码。
答案 1 :(得分:10)
TempData
会持续到下一个请求,如前所述。
但是还有另外两个字典用于单个请求。
Controller
,ViewPage
} .ViewData
Context.Items
从控制器到(主)页面ViewData
进行通信可能是更好的选择。
答案 2 :(得分:2)
我想到了两种方法:
我可能会选择1)。
答案 3 :(得分:1)
访问在Controller(Action)中设置的MasterPage中的数据的常用方法是通过ViewData [“TheDataKey”] =“SomeValue”。
答案 4 :(得分:1)
这相对简单,您可以通过以下几种方式进行操作 - 具体取决于您网站的工作方式。
我正在解释您的请求,因为您需要在请求期间存在的属性或变量,并且对控制器,模型和主控器可见。
静态属性对ASP中的当前应用程序是可见的,这意味着一次连接的用户负载,但不一定是所有用户。 IIS将根据需要生成新的ASP应用程序。
所以你可以这样做:
您可以为您的母版页或代码隐藏页面提供自定义基类(因为所有WebForms内容仍然可用)
您可以为控制器设置自定义基类。
你可以从另一个中找到一个,所以:
void Page_Init( object sender, EventArgs e )
{
var ctrl = this.ViewContext.Controller as MyBaseController;
if ( ctrl != null )
{
MyLocalProp = ctrl.PropOnMyController;
}
}
然后,每个请求将在控制器和母版页中提供。
答案 5 :(得分:0)
您是否查看了附加到控制器类的 tempData ?它是一个简单的字典,通过一个单一的请求保留它的价值。这意味着你的数据只能在控制器中访问,但这应该不是问题。
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"];
}
}
这对我有用。我只用它来显示警告信息等等。