我正在尝试加快asp页面的加载时间。一个小的ui组件使用的方法占用了大约80%的加载时间,因此我将其委托给一个单独的线程,该线程每秒都会被ajax调用查询,以便在组件准备好时显示该组件,同时保持页面其余部分的功能。
后台线程完成后,组件将作为ajax调用的一部分创建。该组件是可折叠的链接列表,每个链接都需要执行回发以加载新页面。由于这些链接是在页面加载后创建的,所以我不能简单地将事件处理程序分配给每个链接的点击事件,因此我创建了一个隐藏按钮(behindTargetLinkButton),并为其分配了单击处理程序,使得href为隐藏按钮看起来像这样;
javascript:__doPostBack('moduleHome$Home$behindTargetLinkButton','')
然后我将每个链接的href设置为以下值,其中args是一个包含每个链接唯一信息的字符串。
javascript:__doPostBack('moduleHome$Home$behindTargetLinkButton','" + args + "')
当我调试服务器端并在处理程序方法中放置一个断点时,我直接点击隐藏按钮(为了测试目的而使其可见)点击它,但是当点击其中一个链接时却没有,即使这两个href是完全相同的。调试客户端,他们都正确地命中了__doPostBack函数,并且都使用相同的eventTarget正确提交表单,所以我不明白为什么隐藏按钮正确地回发到服务器,但个别链接不正确。我也尝试过这样做而不用后者发回任何参数,使得href完全相同,但这没有区别。任何人都可以了解为什么会发生这种情况,并且可能提供问题的解决方案?
ajax调用返回一个字符串,其中包含要放置在现有占位符div(“toggle”)内的组件的html。
StringWriter sw = new StringWriter();
HtmlTextWriter h = new HtmlTextWriter(sw);
toggle.RenderControl(h);
string str = sw.GetStringBuilder().ToString();
使用以下内容创建单个链接,并将其添加到foreach循环中的toggle div;
HtmlGenericControl li = new HtmlGenericControl("li");
LinkButton a = new LinkButton();
a.Attributes["href"] = "javascript:__doPostBack('moduleHome$Home$behindTargetLinkButton','" + args + "')";
li.Controls.Add(a);
隐藏按钮是在html中的aspx页面中创建的;
<asp:LinkButton ID="behindTargetLinkButton" runat="server" Style="display: none;" />
然后在我的代码的OnInit方法中添加了click处理程序。
behindTargetLinkButton.Attributes["link"] = "behindTarget_Edit";
behindTargetLinkButton.Click += new EventHandler(notification_Click);
单击处理程序用于页面上的所有按钮,并在link属性上有一个switch语句,用于决定运行哪个代码;
protected void notification_Click(object source, EventArgs e)
{
LinkButton a = (LinkButton)source;
ModuleAction act;
switch (a.Attributes["link"].ToString())
{
case "behindTarget_Edit":
// Code to create an action to take you to the relevant page
break;
}
}
感谢。