gpt4 book ai didi

c# - 根据回调请求保留 ViewState

转载 作者:太空宇宙 更新时间:2023-11-03 11:14:36 25 4
gpt4 key购买 nike

问题是,我需要在 CallBack 请求期间保留 ViewState

我知道当请求是 CallBack 时,ASP.NET 默认情况下不会保存页面状态。所以,我需要一个替代方案来让它工作。

ASP.NET 应用程序有一个自定义的 PageStatePersister,它将所有页面状态 (ViewState) 存储到 Session。这样 ViewState 就不会在任何时候发送/检索到客户端(尽管隐藏字段仍然存在于页面上,但没有值(value))。 ViewState 不必在 CallBack 响应中返回,我只需要以某种方式调用在正常情况下保存 ViewState 的机制PostBack 请求。

它会是这样的:

protected void Page_LoadComplete(object sender, EventArgs e)
{
//Set anything to the viewstate for accessing on a later postback
ViewState["Anything"] = 1;

if (Page.IsCallback)
{
//Persist the page state manualy (not needed on normal postback)
InvokeAspNetStateSaver();
}
...
}

感谢您的帮助。

最佳答案

终于明白了。

事情是这样的。

在对 Page 类 (System.Web.UI) 进行一些反编译后,我基本上发现了 ASP.NET 在请求处理中所做的事情,包括状态加载和保存.下面的代码是 ASP.NET 对方法 ProcessRequestMain 所做的:

this.Trace.Write("aspx.page", "Begin PreInit");
this.PerformPreInit();
this.Trace.Write("aspx.page", "End PreInit");
this.Trace.Write("aspx.page", "Begin Init");
this.InitRecursive((Control) null);
this.Trace.Write("aspx.page", "End Init");
this.Trace.Write("aspx.page", "Begin InitComplete");
this.OnInitComplete(EventArgs.Empty);
this.Trace.Write("aspx.page", "End InitComplete");

if (this.IsPostBack)
{
this.Trace.Write("aspx.page", "Begin LoadState");
this.LoadAllState();
this.Trace.Write("aspx.page", "End LoadState");
this.Trace.Write("aspx.page", "Begin ProcessPostData");
this.ProcessPostData(this._requestValueCollection, true);
this.Trace.Write("aspx.page", "End ProcessPostData");
}

this.Trace.Write("aspx.page", "Begin PreLoad");
this.OnPreLoad(EventArgs.Empty);
this.Trace.Write("aspx.page", "End PreLoad");
this.Trace.Write("aspx.page", "Begin Load");
this.LoadRecursive();
this.Trace.Write("aspx.page", "End Load");

if (this.IsPostBack)
{
this.Trace.Write("aspx.page", "Begin ProcessPostData Second Try");
this.ProcessPostData(this._leftoverPostData, false);
this.Trace.Write("aspx.page", "End ProcessPostData Second Try");
this.Trace.Write("aspx.page", "Begin Raise ChangedEvents");
this.RaiseChangedEvents();
this.Trace.Write("aspx.page", "End Raise ChangedEvents");
this.Trace.Write("aspx.page", "Begin Raise PostBackEvent");
this.RaisePostBackEvent(this._requestValueCollection);
this.Trace.Write("aspx.page", "End Raise PostBackEvent");
}

this.Trace.Write("aspx.page", "Begin LoadComplete");
this.OnLoadComplete(EventArgs.Empty);
this.Trace.Write("aspx.page", "End LoadComplete");

if (this.IsPostBack && this.IsCallback)
this.PrepareCallback(callbackControlID);
else if (!this.IsCrossPagePostBack)
{
this.Trace.Write("aspx.page", "Begin PreRender");
this.PreRenderRecursiveInternal();
this.Trace.Write("aspx.page", "End PreRender");
}

...

if (this.IsCallback)
{
this.RenderCallback();
}
else
{
if (this.IsCrossPagePostBack)
return;

this.Trace.Write("aspx.page", "Begin PreRenderComplete");
this.PerformPreRenderComplete();
this.Trace.Write("aspx.page", "End PreRenderComplete");
this.BuildPageProfileTree(this.EnableViewState);
this.Trace.Write("aspx.page", "Begin SaveState");
this.SaveAllState();
this.Trace.Write("aspx.page", "End SaveState");
this.Trace.Write("aspx.page", "Begin SaveStateComplete");
this.OnSaveStateComplete(EventArgs.Empty);
this.Trace.Write("aspx.page", "End SaveStateComplete");
this.Trace.Write("aspx.page", "Begin Render");

if (exportedWebPartID != null)
this.ExportWebPart(exportedWebPartID);
else
this.RenderControl(this.CreateHtmlTextWriter(this.Response.Output));

this.Trace.Write("aspx.page", "End Render");
this.CheckRemainingAsyncTasks(false);
}

LoadAllState() 方法负责加载页面状态,它执行每个 PostBack 请求。

SaveAllState() 方法负责保存页面状态。 ASP.NET 像下面的代码一样执行它:

if (this.IsCallback)
{
this.RenderCallback();
}
else
{
...
this.SaveAllState();
...
}

所以这就是我的 ViewState 没有保存在 CallBack 请求中的原因!

所以,终于有了解决方案!使用反射手动调用 SaveAllState() 方法!

if (Page.IsCallback)
{
System.Reflection.MethodInfo saveAllStateMethod = typeof(System.Web.UI.Page).GetMethod("SaveAllState", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
saveAllStateMethod.Invoke(Page, null);
}

关于c# - 根据回调请求保留 ViewState,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13048238/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com