c# - outside - update panel asp.net trigger
Postback completo activado por LinkButton dentro de GridView dentro de UpdatePanel (8)
Debe registrar cada LinkButton como AsyncPostBackTrigger
. Después de que cada fila esté encuadernada en su GridView, deberá buscar el LinkButton y registrarlo a través del 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 se ClientIDMode="AutoID"
para LinkButton, como se menciona here (gracias a Răzvan Panda por señalar esto).
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?
<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>
Debe registrar cada control para cada RowState. 1: Registre sus controles para RowState = Alternate y Normal) 2: Registre sus controles para RowState = Edit 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 detrá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 );
}
}
MSDN especifica que la propiedad UpdatePanel.ChildrenAsTriggers "[g] ets o establece un valor que indica si las devoluciones de los controles secundarios inmediatos de un control UpdatePanel actualizan el contenido del panel" (consulte http://msdn.microsoft.com/en-us/library/system.web.ui.updatepanel.childrenastriggers.aspx ).
Como su LinkButton no parece ser un "control secundario inmediato", le recomendaría configurar su LinkButton como AsyncPostBackTrigger explícito.
Debajo de su etiqueta </ ContentTemplate>, intente agregar esto:
<Triggers>
<asp:AsyncPostBackTrigger ControlID="MarkAsCompleteButton" EventName="Click" />
</Triggers>
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 botón de enlace pongo:
protected void LinkButton2_Click(object sender, EventArgs e)
{
UpdatePanel2.Update();
}
Probablemente no sea aconsejable, pero puede hacer que todo en el trabajo de GridView sea asincrónico al excluir el nombre de evento en AsyncPostBackTrigger, por ejemplo.
<Triggers>
<asp:AsyncPostBackTrigger ControlID="OrderGrid" />
</Triggers>
Esto hará que el evento RowCommand y cualquier otro evento en el fuego GridView se activen 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.
Tuve un problema en el que tenía un formulario que funcionaba bien ( page1
), otro en el que estaba todo el contenido de la publicación ( page2
). Resultó que cuando hice la segunda página, había hecho demasiadas operaciones de 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 el checkstuff
no se definió en la page 2
.
eliminó la onsubmit
y las publicaciones parciales comenzaron a funcionar.
En la página de trabajo - página 1, se definió el producto de checkstuff
, pero era solo un talón, que no hizo más que devolver verdadero. Solo por sonrisas, puse una alerta en el 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 todavía se ejerce, como si se estuviera enviando una página completa. Así que revisa las secuencias de comandos del lado del cliente.
esto puede ser viejo, pero mi solución fue poner un panel de actualización dentro de la plantilla de elemento 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 Cambio de Índice de Página. Trata eso.
Coloque el siguiente elemento dentro del elemento system.web en el archivo web.config
<xhtmlConformance mode="Transitional"/>