使用运行时创建的链接来触发ASP.Net中隐藏按钮的单击处理程序

时间:2013-11-28 14:25:17

标签: c# javascript asp.net ajax

我正在尝试加快asp页面的加载时间。一个小的ui组件使用的方法占用了大约80%的加载时间,因此我将其委托给一个单独的线程,该线程每秒都会被ajax调用查询,以便在组件准备好时显示该组件,同时保持页面其余部分的功能。

后台线程完成后,组件将作为ajax调用的一部分创建。该组件是可折叠的链接列表,每个链接都需要执行回发以加载新页面。由于这些链接是在页面加载后创建的,所以我不能简单地将事件处理程序分配给每个链接的点击事件,因此我创建了一个隐藏按钮(behindTargetLinkBut​​ton),并为其分配了单击处理程序,使得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;
    }
}

感谢。

1 个答案:

答案 0 :(得分:0)

你已经提供了很多信息但缺少一个:aspx.cs后端的骨架。

然而有一件事在我脑海中浮现。您没有将动态链接按钮附加到EventHandler

foreach (Control ctrl in plhDynamicLinks.Controls)
{
    LinkButton dynamicButton = (LinkButton)ctrl;
    dynamicButton.Click += new EventHandler(LinkButton_Click);
}

试试这个,请提供更多信息:)

更多信息:LINK1LINK2