【问题标题】:Setting Page Async mode to true from Code-Behind从 Code-Behind 将页面异步模式设置为 true
【发布时间】:2015-09-10 15:52:20
【问题描述】:
是否可以在我的代码隐藏文件中设置页面指令的异步模式。
我无法直接修改<%@Page %> 属性,并且努力寻找在我的代码隐藏中实现此功能的方法。
我尝试在我的 Page_Load 方法中添加Page.AsyncMode = true,但它返回以下错误:
由于其保护级别而无法访问
有没有办法做到这一点?无法直接修改母版页?
【问题讨论】:
标签:
c#
asp.net
asynchronous
code-behind
【解决方案1】:
不,您不能在代码隐藏中更改页面的异步模式。异步页面实现了IHttpAsyncHandler接口,在ASP.NET编译完.aspx文件并运行代码后,无法更改页面实现的接口。
设置Page.AsyncMode 属性不会改变异步模式。其目的是让页面上的控件知道页面是否在异步模式下运行,因此篡改属性可能会导致控件发生故障。
【解决方案2】:
我的猜测 - 您正试图从您的母版页访问此属性。但是根据documentation,这个属性是protected bool AsyncMode { get; set; }。这意味着它可以从声明它的类中访问,也可以从声明此成员的类派生的任何类中访问。
此属性在System.Web.UI.Page 中声明,并且可以在其中访问,并且可以访问从它派生的任何类。 MasterPage 不是从 Page 派生的。这就是您无法访问它的原因。
您可以从您的页面轻松访问它:
public partial class YourPage : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
this.AsyncMode = true;
}
}
【解决方案3】:
因为您的 MasterPage 不从您的 Page 继承,所以您无法访问 AsyncMode 属性。
如果您绝对必须编辑 MasterPage 中的值,可以考虑向您的页面添加一个名为“UpdateAsyncMode”的方法,并在您的 MasterPage Page_Load 中执行以下操作
protected void Page_Load(object sender, EventArgs e)
{
MyPageClass p = this.Page as MyPageClass ;
p.UpdateAsyncMode(true);
}
或者,如果这需要更健壮,您可以为页面创建一个基类,如下所示,并让您网站中的所有网页都扩展该基类
public abstract class MyBasePage : System.Web.UI.Page
{
public void UpdateAsyncMode (bool b)
{
this.AsyncMode = b;
}
}