我想通了。要通过 UpdatePanel 部分回发到服务器而不使用隐藏控件,请使用 jQuery 执行此操作:
<script type="text/javascript">
$(document).ready(function () {
__doPostBack('<%=UpdatePanel1.ClientID %>');
});
</script>
一旦 HTML DOM 准备好,这将针对 ID 为 UpdatePanel1 的 UpdatePanel 执行部分回发到服务器。然后,您可以使用 ASP.NET 页面生命周期来挂钩任何适合您的事件。我勾上了更新面板的加载事件:
protected void UpdatePanel1_Load(object sender, EventArgs e)
{
if (Page.IsPostBack && Session["InitializedKey"] == null)
{
Session["InitializedKey"] = true;
// do your initialization stuff here
}
}
上面的代码只有在页面被回发并且会话变量被设置时才会运行。现在您必须在用户刷新页面时清除会话变量,因为这里的目的是在第一次回发时运行此代码,并且只在第一次回发时运行。所以清除Page_Load中的session变量:
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
Session[initializedKey] = null;
}
如果您想在页面处于部分回发状态时显示进度指示器,请执行以下 javascript:
<script type="text/javascript">
var prm = Sys.WebForms.PageRequestManager.getInstance();
prm.add_beginRequest(BeginRequestHandler);
prm.add_endRequest(EndRequestHandler);
function BeginRequestHandler(sender, args) {
if (args._postBackElement.id == '<%=UpdatePanel1.ClientID %>') {
$get('Progress').className = 'Progress';
}
}
function EndRequestHandler(sender, args) {
if (sender._postBackSettings.sourceElement.id == '<%=UpdatePanel1.ClientID %>') {
$get('Progress').className = 'Hidden';
}
}
</script>
这需要一个带有 id 'Progress' 的 div 标签,以及你想在该 div 中显示的任何内容。您还需要一些 css 来在名为 Hidden 和 Progress 的类中的 div 标签上设置显示和可见样式。不要忘记对部分回发执行错误处理!