从UpdatePanel以编程方式强制完全回发

phi*_*ilw 6 c# asp.net updatepanel asp.net-ajax

我在更新面板中有一个GridView.它是一个继承的asp:GridView,所以它有一个"导出我"的图标就是这样做的.它通过响应带有XLS文件的"导出"单击来工作.问题是,如果您将智能GridView放在更新面板中,ASP.NET认为XLS文件将写入面板,这显然不是我们想要的.为此,我每次都需要一个完整的回复.

我的更新面板都是以编程方式生成的

解决方案在这种精确的情况下不起作用(其中许多在SO的其他地方都有涉及):

  1. 在版本4之前的ASP.NET中,如果您将ID从控件中删除,它甚至可以在更新面板中执行完整的回发.我的问题是仅针对最新最好的.NET 4.

  2. ScriptManager.RegisterPostBackControl看起来很有前途.它确实使控制后期使用正确的面板ID作为事件目标,但是没有其他帮助.

  3. 将PostBackTrigger添加到"更新"面板.我的更新面板是以编程方式生成的,MS声明不支持此更新.我的测试表明他们是对的:我尝试过各种方式,但这不起作用.

  4. 我不太喜欢智能GridView不得不脱离自己的想法,但我试图让它在这些情况下在updatePanel之外添加一个额外的控件.通过客户端javascript重定向客户端单击面板内的导出按钮的想法,以模拟面板外部的该按钮的单击.但是这不起作用,因为我无法将"外部"控件添加到页面中 - 我得到"在DataBind,Init,Load,PreRender或Unload阶段无法修改控件集合".错误.

  5. 使用jQuery将"导出"控件移到面板外部.MS必须有一些他们认为在面板中"控制"的控件列表,并且DOM中的物理位置无关紧要.

有没有人有任何想法如何使这项工作?我知道很多这个应该有用,但那不是一回事.

jda*_*ies 4

对我来说,解决方案 3 有效。

我动态地将一个添加UpdatePanel到页面,将一个添加Button到内容模板并关联一个PostBackTrigger. 我添加了一个事件处理程序,在其中使用当前日期/时间Click更新标签(在 之外)。UpdatePanel

请参阅下面我的测试设置。

标记

<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
<asp:Panel ID="Panel1" runat="server"></asp:Panel>
<asp:Label ID="Label1" runat="server"></asp:Label>
Run Code Online (Sandbox Code Playgroud)

代码隐藏

protected void Page_Load(object sender, EventArgs e)
{
    string buttonId = "Button1";

    UpdatePanel updatePanel = new UpdatePanel();
    updatePanel.ID = "UpdatePanel1";

    Button button = new Button();
    button.ID = "Button1";
    button.Text = "Post back";
    button.Click += new EventHandler(button_Click);

    updatePanel.Triggers.Add(new PostBackTrigger() { ControlID = buttonId});

    updatePanel.ContentTemplateContainer.Controls.Add(button);

    Panel1.Controls.Add(updatePanel);
}

void button_Click(object sender, EventArgs e)
{
    Label1.Text = string.Format("Current date/time: {0}", DateTime.Now.ToString());
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。