在ASP.NET网站上,是每个Web请求唯一的静态类,还是在需要时实例化它们并在GC决定处理它们时进行GC操作?
我问的原因是因为我之前在C#中编写了一些静态类,并且行为与我预期的不同.我希望静态类对每个请求都是唯一的,但似乎并非如此.
如果它们并非每个请求都是唯一的,那么有没有办法让它们成为现实?
更新:
答案给了我正是我所需要的.我已经在使用单例类,但是它使用的是一个静态实例,因此即使用户不同也在请求之间共享,在这种情况下这是一件坏事.使用HttpContext.Current.Items完美地解决了我的问题.对于任何在将来偶然发现这个问题的人来说,这是我的实现,简化和缩短,以便易于理解模式:
using System.Collections;
using System.Web;
public class GloballyAccessibleClass
{
private GloballyAccessibleClass() { }
public static GloballyAccessibleClass Instance
{
get
{
IDictionary items = HttpContext.Current.Items;
if(!items.Contains("TheInstance"))
{
items["TheInstance"] = new GloballyAccessibleClass();
}
return items["TheInstance"] as GloballyAccessibleClass;
}
}
}
Run Code Online (Sandbox Code Playgroud) 我想我可能在WebMatrix的PageData中发现了一个错误,但我不确定.它涉及如何将数据从部分页面传递回调用页面.
在WebMatrix文档(教程,例如" 3 - 创建一致外观 "和示例代码)中,建议使用PageData作为在页面之间传递数据的机制(例如,从内容页面到布局页面,或者到部分页面) .
但是我发现这并不总是以另一种方式工作,将数据从部分页面传递回调用页面.在部分页面中修改或添加PageData中的条目似乎不会返回到调用页面.
从最简单的可能示例开始,在测试页面中我们可能会这样:
@{
PageData["test"] = "Initial entry";
}
<p>Before calling the partial page, the test value is @PageData["test"]</p>
@RenderPage("_TestPartial.cshtml")
<p>After returning to the calling page, the test value is @PageData["test"]</p>
Run Code Online (Sandbox Code Playgroud)
在_TestPartial.cshtml页面中我们可能会这样:
@{
PageData["test"] = "Modified entry";
}
<p>In the partial page, the test value has been modified to @PageData["test"]</p>
Run Code Online (Sandbox Code Playgroud)
结果输出如下:
在调用部分页面之前,测试值为Initial entry
在部分页面中,测试值已修改为修改条目
返回调用页面后,测试值为Initial entry
因此,当您返回到调用页面时,部分页面对PageData的修改将丢失.如果我们在部分页面中向PageData添加新条目,则会出现同样的情况.它们在返回调用页面时丢失了.
我不知道这种行为是否是一个错误,或者它是否是有意的,但它让你没有一种干净的方式将数据从部分页面传递回其调用页面.还有另一种(相对干净的)方法吗?或者,如果它是一个bug,是否有解决方法?
我正在尝试从PartialView设置pageTitle
这是我的代码:
PartialView模板:
@{
((WebViewPage)WebPageContext.Current.Page).ViewBag.Title = "Page title";
}
Run Code Online (Sandbox Code Playgroud)
_Layout.cshtml:
<title> @ViewBag.Title</title>
Run Code Online (Sandbox Code Playgroud)
这该怎么做?