2012-09-20 15 views
5

En una aplicación web ASP.NET 4.0, tengo un control de usuario envuelto por un Panel de actualización (consulte el código a continuación).Cómo forzar el botón hacer una devolución de datos completa en lugar de una devolución de datos asincrónica

<asp:UpdatePanel ID="UpdatePanel5" runat="server" UpdateMode="Conditional"> 
    <ContentTemplate> 
     <UC:MyCustomCtrl ID="customCtrl" runat="server" /> 
    </ContentTemplate> 
</asp:UpdatePanel> 

Obviamente, esto funciona muy bien para cada control ASP.NET que provoca una devolución de datos en mi control de usuario, ya que hace ocurrir de forma asíncrona. Sin embargo, hay un proceso que no funciona.

Tengo un botón ASP.NET (Crear informe) en el control de usuario que realiza una solicitud asíncrona al servidor. Luego, el servidor crea una hoja de cálculo de Excel y luego coloca la hoja de cálculo en HttpResponse para enviarla al navegador del cliente para que pueda abrirla/guardarla. Sin embargo, explota en este punto porque la solicitud al servidor es asincrónica y aparentemente no se puede poner un binario en el HttpResponse durante una solicitud asincrónica.

¿Cómo puedo evitar esto?

Respuesta

11

Registro este botón como el control de devolución de datos síncrona en el método de control de usuario Page_Load: ScriptManager.GetCurrent(Page).RegisterPostBackControl(CreateReportButton);

+0

Gracias. Llegué a una respuesta similar no hace mucho tiempo. Pero básicamente son lo mismo: registre el control con ScriptManager. En mi caso, implica encontrar el control en el control del usuario y luego registrarlo con el ScriptManager. – Jagd

0

Utilice los activadores dentro del panel de actualización para hacer referencia al control personalizado y un evento registrado en el botón de informe dentro del control, p.

<Triggers> 
    <asp:PostBackTrigger ControlID="customCtrl" EventName="ReportButtonClicked" /> 
</Triggers> 
+0

Ya lo intenté. El botón está dentro del control personalizado e intenta usar el nombre del botón como un disparador, incluso no se compilará. – Jagd

+0

A la derecha, tendrá que registrar un evento en el control personalizado y luego consultarlo de esa manera, se editará. – Turnkey

0

puede agregar disparadores para UpdatePanels que permiten plena segundo palo. he aquí un ejemplo

<asp:UpdatePanel ID="UpdatePanel5" runat="server" UpdateMode="Conditional"> 
    <ContentTemplate> 
     <UC:MyCustomCtrl ID="customCtrl" runat="server" /> 
    </ContentTemplate> 
    <Triggers> 
     <asp:PostBackTrigger ControlID="btnID" /> 
    </Triggers> 
</asp:UpdatePanel> 
+0

Ya lo intenté. El botón está dentro del control personalizado e intenta usar el nombre del botón como un disparador, incluso no se compilará. – Jagd

+0

¿Entonces es posible sacar ese control de usuario particular del panel de actualización? –

0

Similar a la respuesta de Eric. No he probado esto, pero puede trabajar ...

<asp:UpdatePanel ID="UpdatePanel5" runat="server"> 
    <ContentTemplate> 
     <UC:MyCustomCtrl ID="customCtrl" runat="server" /> 
    </ContentTemplate> 
    <Triggers> 
     <asp:PostBackTrigger ControlID="customCtrl$btnID" /> 
    </Triggers> 
</asp:UpdatePanel> 

hice algo similar a esto un tiempo atrás para los controles de validación, por lo que parece lógico que funciona aquí también.

Use su visor DOM (utilizo el inspector de elementos de Chrome) y vea cuál es el "NOMBRE" de su botón (no ID). Y comenzando con la parte que contiene el nombre del control general del usuario, use el resto.

Cuestiones relacionadas