2011-02-02 81 views
37

Tengo un GridView dentro de un UpdatePanel. En un campo de plantilla, hay un botón que uso para marcar elementos. Funcionalmente, esto funciona bien, pero el botón siempre desencadena una devolución de página completa en lugar de una devolución de datos parcial. ¿Cómo obtengo el botón para activar una devolución de datos parcial?Postback completo desencadenado por LinkButton dentro de GridView dentro de UpdatePanel

<asp:ScriptManager ID="ContentScriptManager" runat="server" /> 
<asp:UpdatePanel ID="ContentUpdatePanel" runat="server" ChildrenAsTriggers="true"> 
    <ContentTemplate> 
     <asp:GridView ID="OrderGrid" runat="server" AllowPaging="false" AllowSorting="false" 
      AutoGenerateColumns="false"> 
      <Columns> 
       <asp:TemplateField HeaderText=""> 
        <ItemTemplate> 
         <asp:LinkButton ID="MarkAsCompleteButton" runat="server" Text="MarkAsComplete" 
          CommandName="MarkAsComplete" CommandArgument='<%# Eval("Id") %>' /> 
        </ItemTemplate> 
       </asp:TemplateField> 
       <asp:BoundField DataField="Name" HeaderText="Name" /> 
       <asp:BoundField DataField="LoadDate" HeaderText="Load Date" /> 
       <asp:BoundField DataField="EmployeeCutOffDate" HeaderText="Cut Off Date" /> 
       <asp:BoundField DataField="IsComplete" HeaderText="Is Completed" /> 
      </Columns> 
     </asp:GridView> 
    </ContentTemplate> 
</asp:UpdatePanel> 
+0

Creé este escenario en un proyecto nuevo. No pude hacer que tu postback completo suceda, fue parcial cada vez. ¿Hay otros factores que se te ocurran que sean extraños en tu caso? –

+0

¿Puedes publicar el código de lo que estás haciendo en ese comando "MarkAsComplete"? –

+0

Asegúrate de no haber deshabilitado todos los javascript usando las herramientas de desarrollo web en Firefox. – Cem

Respuesta

71

Debe registrarse todos y cada LinkButton como AsyncPostBackTrigger. Después de cada fila está ligada en su GridView, tendrá que buscar la LinkButton y registrarlo a través de código subyacente de la siguiente manera:

protected void OrderGrid_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    LinkButton lb = e.Row.FindControl("MarkAsCompleteButton") as LinkButton; 
    ScriptManager.GetCurrent(this).RegisterAsyncPostBackControl(lb); 
} 

Esto también requiere que ClientIDMode="AutoID" engaste para el LinkButton, como se ha mencionado here (gracias a Răzvan Panda para señalar esto).

+0

@Lionel mencionó algo a continuación que encontré extremadamente útil además de esta respuesta. Dentro del controlador 'OrderGrid_RowDataBound', es inteligente hacer una comprobación para que la fila actual sea una fila de datos (ya que es posible que el 'LinkButton' que está buscando no esté en una fila de encabezado). 'si (e.Row.RowType == DataControlRowType.DataRow) { LinkButton lb = e.Row.FindControl ("MarkAsCompleteButton") como LinkButton; ScriptManager.GetCurrent (this) .RegisterAsyncPostBackControl (lb); } ' De lo contrario, obtendrá un NPE cuando no pueda encontrar una ID para ese botón. – bradykey

+0

Si su Gridview está fuera de UpdatePanel, esto no funcionará. Use ** RowCreated ** en su lugar. – gUIDo

1

MSDN especifica que la propiedad de los UpdatePanel.ChildrenAsTriggers "[g] ets o establece un valor que indica si las devoluciones de datos de controles secundarios inmediatos de una actualización de control UpdatePanel contenido del panel" (ver http://msdn.microsoft.com/en-us/library/system.web.ui.updatepanel.childrenastriggers.aspx).

Dado que su LinkButton no parece ser un "control secundario inmediato", le recomendaría configurar su LinkButton como AsyncPostBackTrigger explícito.

A continuación la etiqueta </ContentTemplate >, trate de añadir esto:

<Triggers> 
    <asp:AsyncPostBackTrigger ControlID="MarkAsCompleteButton" EventName="Click" /> 
</Triggers> 
+2

Esto no funcionará porque esa ID de control no está visible fuera de la fila. –

1

Ponga el elemento siguiente dentro elemento system.web en el archivo web.config

<xhtmlConformance mode="Transitional"/> 
5

Probablemente no es recomendable pero se puede hacer todo en el trabajo de forma asincrónica GridView mediante la exclusión de la eventName en el AsyncPostBackTrigger así por ejemplo,

<Triggers> 
    <asp:AsyncPostBackTrigger ControlID="OrderGrid" /> 
</Triggers> 

Esto hará que el evento RowCommand y cualquier otro evento en el fuego GridView de forma asíncrona. Tenga en cuenta también que cuando hace ClientIDMode = "Static" en el GridView, se realizará una devolución de datos completa.

+0

Gracias! El 'ClientIDMode =" Static "' fue el problema. Al eliminar eso funciona de nuevo. – Flo

+0

La nota de que "cuando haces' ClientIDMode "Static" 'en el GridView, se generará una devolución completa" fue increíblemente útil. Esta información en conjunto con el registro forzoso de cada LinkButton como control de devolución asíncrono me la arregló, ya que no pude eliminar el 'ClientIDMode =" Static "' por otros motivos. ¡Muchas gracias! – bradykey

-1

Debe registrar cada control para cada RowState. 1: Registro de sus controles para RowState = alternativo y Normal) 2: Registro de sus controles para RowState = Editar 3: ...

ASPX:

<asp:TemplateField HeaderText=""> 
       <ItemTemplate> 
        <asp:LinkButton runat="server" ID="Btn1" 
         CommandName="Edit" CommandArgument='<%# Container.DataItemIndex + ";" + Eval("idinterlocuteur") %>'><i class="fa fa-pencil-square-o"></i></asp:LinkButton> 
       </ItemTemplate> 
       <EditItemTemplate> 
        <asp:LinkButton ID="Btn2" runat="server" CommandName="Update" CommandArgument='<%# Container.DataItemIndex + ";" + Eval("idinterlocuteur") %>'><i class="fa fa-check"></i></asp:LinkButton> 
       </EditItemTemplate> 
      </asp:TemplateField> 

Código atrás:

protected void GridView_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow 
     && (e.Row.RowState == DataControlRowState.Normal 
      || e.Row.RowState == DataControlRowState.Alternate)) 
    { 
     LinkButton Btn1 = e.Row.FindControl("Btn1 ") as LinkButton; 
     ScriptManager.GetCurrent(this.Parent.Page).RegisterAsyncPostBackControl(Btn1); 
    } 
    if (e.Row.RowType == DataControlRowType.DataRow 
     && e.Row.RowState == DataControlRowState.Edit) 
    { 
     LinkButton Btn2 = e.Row.FindControl("Btn2 ") as LinkButton; 
     ScriptManager.GetCurrent(this.Parent.Page).RegisterAsyncPostBackControl(Btn2);  
    } 
} 
+0

¡Bienvenido a Stack Overflow! Una explicación adicional mejoraría tu respuesta. – ryanyuyu

3

Mi vista de cuadrícula está en modo condicional.

protected void gvAgendamentoExclui_RowDataBound(object sender, GridViewRowEventArgs e) 
    { 
     if (e.Row.RowType == DataControlRowType.DataRow) { 
      LinkButton lnk = e.Row.FindControl("LinkButton2") as LinkButton; 
      AsyncPostBackTrigger trigger = new AsyncPostBackTrigger(); 
      trigger.ControlID = lnk.UniqueID; 
      trigger.EventName = "Click"; 
      UpdatePanel2.Triggers.Add(trigger); 

     } 
    } 

Y en el evento click del LinkButton pongo:

protected void LinkButton2_Click(object sender, EventArgs e) 
    { 
     UpdatePanel2.Update(); 
    } 
+0

¿Qué quieres decir con que tu gridview está en modo condicional? –

+0

Esto produce el error 'Una excepción de tipo 'System.InvalidOperationException' No se pudo encontrar un control con ID 'LinkButton2' para el desencadenador en UpdatePanel 'UpdatePanel2'' –

0

tuve un problema por el que tuve trabajando bien una forma (page1), otros hacen espaldas colocar enteros (page2).Resultó que cuando hice la segunda página, había hecho demasiado cut/paste, y todavía tenía una llamada javascript en la definición del formulario.

< form id="form1" runat="server" onsubmit="return checkstuff();"> 

Pero checkstuff no estaba definido en page 2.

borró el onsubmit, y las publicaciones parciales comenzaron a funcionar.

En la página de trabajo - página 1, se definió checkstuff, pero era solo un talón, que no hizo nada más que devolver verdadero. Solo por sonrisas, puse una alerta en checkstuff, y por supuesto, se llama para todos los envíos, parciales o no. Y, si cambié el talón para simplemente devolver falso, no pasó nada.

Señale en todo esto que el javascript aún se ejerce, como si se enviara una página completa. Así que revisa las secuencias de comandos del lado del cliente.

0

esto puede ser viejo, pero mi solución fue poner un panel de actualización dentro del elemento Plantilla y uno fuera de la vista de cuadrícula también.

el disparador debe ser la vista de grilla y el gatillo externo debe ser la vista de grilla y el Desplazamiento de página. Trata eso.

+0

Además de su respuesta, debe asegurarse de incluir para incluir el el código que encontró para su solución para ayudar a futuros lectores con el mismo problema. – buczek

Cuestiones relacionadas