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

Using runtime created links to trigger the click handler of a hidden button in ASP.Net

本文关键字:隐藏 Net 按钮 ASP 处理 单击 程序 运行时 创建 链接      更新时间:2023-11-22

我正在努力加快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循环中的togglediv中;

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方法中。

behindTargetLinkButton.Attributes["link"] = "behindTarget_Edit";
behindTargetLinkButton.Click += new EventHandler(notification_Click);

点击处理程序用于页面上的所有按钮,并在链接属性上有一个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;
    }
}

谢谢。

您已经放置了很多信息,但缺少一个:aspx.cs后端的骨架。

尽管如此,我还是想到了一件事。您没有将动态链接按钮附加到EventHandler

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

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

更多信息:LINK1,LINK2