Полная обратная передача, вызванная LinkButton внутри GridView внутри UpdatePanel
У меня есть GridView внутри 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>
Ответы
Ответ 1
Вам необходимо зарегистрировать каждый LinkButton как AsyncPostBackTrigger
. После того, как каждая строка привязана к вашему GridView, вам нужно будет найти LinkButton и зарегистрировать его через код следующим образом:
protected void OrderGrid_RowDataBound(object sender, GridViewRowEventArgs e)
{
LinkButton lb = e.Row.FindControl("MarkAsCompleteButton") as LinkButton;
ScriptManager.GetCurrent(this).RegisterAsyncPostBackControl(lb);
}
Это также требует, чтобы ClientIDMode="AutoID"
был установлен для LinkButton, как упоминалось здесь (благодаря Răzvan Panda для указания этого).
Ответ 2
Возможно, это не рекомендуется, но вы можете сделать все в GridView асинхронно, исключив EventName в AsyncPostBackTrigger, например,
<Triggers>
<asp:AsyncPostBackTrigger ControlID="OrderGrid" />
</Triggers>
Это приведет к асинхронному событию RowCommand и любому другому событию в режиме GridView. Также обратите внимание, что при создании ClientIDMode = "Static" в GridView это приведет к полной обратной передаче.
Ответ 3
Мой вид сетки находится в условном режиме.
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);
}
}
И в событии click кнопки link я положил:
protected void LinkButton2_Click(object sender, EventArgs e)
{
UpdatePanel2.Update();
}
Ответ 4
MSDN указывает, что свойство UpdatePanel.ChildrenAsTriggers "[g] задает или задает значение, указывающее, обновляют ли обратные вызовы от непосредственных дочерних элементов управления UpdatePanel содержимое панели" (см. http://msdn.microsoft.com/en-us/library/system.web.ui.updatepanel.childrenastriggers.aspx).
Поскольку ваш LinkButton не является "непосредственным дочерним элементом управления", я бы рекомендовал настроить ваш LinkButton как явный AsyncPostBackTrigger.
Ниже вашего </ContentTemplate> тега, попробуйте добавить это:
<Triggers>
<asp:AsyncPostBackTrigger ControlID="MarkAsCompleteButton" EventName="Click" />
</Triggers>
Ответ 5
Поместите следующий элемент внутри элемента system.web в файл web.config
<xhtmlConformance mode="Transitional"/>
Ответ 6
У меня была проблема, когда у меня была одна форма, работающая нормально (page1
), другая - все сообщения (page2
). Оказавшись, когда я сделал вторую страницу, я сделал слишком много cut/paste
, и у нее все еще был вызов javascript
в определении формы.
< form id="form1" runat="server" onsubmit="return checkstuff();">
Но checkstuff
не был определен в page 2
.
удалил onsubmit
, и частичные сообщения начали работать.
На рабочей странице - стр. 1 была определена checkstuff
, но она была всего лишь заглушкой, что не более чем возвращало true. Только для усмешек я поставил предупреждение в checkstuff
, и, конечно же, он вызван для всех подчиненных, частичных или нет. И, если я изменил заглушку, чтобы просто вернуть false, ничего не произошло вообще.
Точка во всем этом, javascript по-прежнему выполняется, как если бы была отправлена полная страница. Поэтому дважды проверьте свои сценарии на стороне клиента.
Ответ 7
это может быть старым, но мое решение состояло в том, чтобы установить панель обновления внутри элемента itemTemplate, а также за пределы gridview.
триггер должен быть gridview, а внешний триггер должен быть gridview и PageIndexChanging. Попробуйте это.
Ответ 8
Вам нужно зарегистрировать каждый элемент управления для каждого RowState.
1: Зарегистрируйте свои элементы управления для RowState = Alternate и Normal)
2: Зарегистрируйте свои элементы управления для 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>
Код позади:
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 );
}
}