【问题标题】:How to force a full postback on a button created in code behind and displayed in an UpdatePanel如何对在后面的代码中创建并显示在 UpdatePanel 中的按钮强制执行完整回发
【发布时间】:2014-12-20 12:07:55
【问题描述】:

我正在使用包含 Button 1 的 asp.net UpdatePanel。单击 Button1 时,会在后面的代码中创建一个字符串,然后将其发送回 updatePanel。该字符串包含应触发回发以执行 Button2_Click 函数的 Button2。不幸的是,我还不能在按钮 2 上执行完整的回发。

如果我在我的 aspx 页面上的 UpdatePanel 中将 Button2 添加为 PostBackTrigger 控件,我会收到一个错误,即找不到控件 (Button2)。这是有道理的,因为 Button2 是通过在后面的代码中单击 Button1 来创建的,并且在页面加载时不可用。

我正在尝试在页面加载时 RegisterPostBackControl(Button2),但我再次收到一个错误,即 Button2 在当前上下文中不存在。

任何帮助将不胜感激。

ASPX 页面

<asp:ScriptManager ID="ScriptManager" runat="server" />
<asp:UpdatePanel ID="UpdatePanel1" UpdateMode="Conditional" runat="server">
<ContentTemplate>
   <fieldset>

   <div runat="server" id="DIV1">Testing...<br /></div>
   <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" clientidmode="static"/> 

   <div runat="server" id="DIV2"></div>
   <asp:Label ID="DIV2_LABEL" runat="server"></asp:Label>
   </fieldset>
</ContentTemplate>

代码隐藏

protected void Page_Load(object sender, EventArgs e)
    {
        ScriptManager.GetCurrent(Page).RegisterPostBackControl(Button2);
    }

protected void Button1_Click(object sender, EventArgs e)
    {
        string DIV1_Html;
        DIV1_Html= DIV1.InnerHtml;

        DIV2.InnerHtml = DIV1_Html;
        DIV2.InnerHtml += "<input id='Button2' type='button' value='button' runat='server' OnClick='Button2_Click' />";

    }

 protected void Button2_Click(object sender, EventArgs e)
    {

        DIV2_LABEL.Text = "Testing button2";
    }

编辑

根据以下建议,我添加了如下按钮:

代替:

 DIV2.InnerHtml += "<input id='Button2' type='button' value='button' runat='server' OnClick='Button2_Click' />";

我已将代码修改如下:

 Button Button2 = new Button();
 Button2.Text = "Add";
 Button2.Click += new EventHandler(Button2_Click);
 PostBackTrigger pTrigger = new System.Web.UI.PostBackTrigger() { ControlID = Button2.ID };
 UpdatePanel1.Triggers.Add(pTrigger);
 DIV2.Controls.Add(Button2);

但是我仍然缺少一些东西,因为当我单击没有错误的新按钮时没有触发 Button2_Click 函数。 ?????

【问题讨论】:

    标签: c# asp.net ajax updatepanel


    【解决方案1】:

    由于您的 Button2 是在客户端创建的,因此 updatePanel1 无法识别它的 ID。 您可以像这样动态创建 Button2:

    Button button2 = new Button();
    PostBackTrigger pTrigger = new System.Web.UI.PostBackTrigger() { ControlID = button2.ID };
    updatePanel1.Triggers.Add(pTrigger);
    
    DIV2.Controls.Add(button2);
    

    更新:以下是您可以使用的小示例:

    public partial class WebForm1 : System.Web.UI.Page
    {
        private bool ShowButton2()
        {
            return ViewState["createButton"] == null ? false : (bool)ViewState["createButton"];
        }
    
        protected void Page_Load(object sender, EventArgs e)
        {
            if (ShowButton2())
                CreateButton();
        }
    
        void CreateButton()
        {
            Button Button2 = new Button();
            Button2.Text = "Add";
            Button2.ID = "button2";
            Button2.Click += Button2_Click;
            PostBackTrigger pTrigger = new System.Web.UI.PostBackTrigger() { ControlID = Button2.ID };
            updatePanel1.Triggers.Add(pTrigger);
            DIV2.Controls.Add(Button2);
        }
    
        void Button2_Click(object sender, EventArgs e)
        {
    
        }
    
        protected void button1_Click(object sender, EventArgs e)
        {
            if (!ShowButton2())
            {
                ViewState["createButton"] = true;
                CreateButton();
            }
        }
    
    }
    

    视图状态当然是显示 Button2 的标志。

    【讨论】:

    • 我已按照建议更改了代码(请参阅我的编辑),但服务器端函数 (Button2_Click) 仍未触发....运行时没有错误。
    • 如果您有 button2 的 Click 事件处理程序,那么您必须每次都在 Page_Load 中重新创建动态控件。
    【解决方案2】:

    按钮上有一个名为 OnClientClick 的属性,您可以使用它来调用 javascript,然后导航到您的页面。

    例子:

    在您的 apsx 页面中

    <script type="javascript">
    function reloadPage() {
        window.location.href = '...';
    }
    

    在你的代码后面

    DIV2.InnerHtml += "<input id='Button2' type='button' value='button' OnClick='ReloadPage()' />";
    

    【讨论】:

    • 刚刚意识到Button2是动态创建的。我已经更改了上面的代码。
    猜你喜欢
    • 2011-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多