Полная обратная передача, вызванная LinkButton внутри GridView внутри UpdatePanel

У меня есть GridView внутри UpdatePanel. В поле шаблона используется кнопка, которую я использую для маркировки элементов. Функционально это работает отлично, но кнопка всегда запускает обратную передачу полной страницы вместо частичной обратной передачи. Как заставить кнопку запускать частичную обратную передачу?

       <asp:LinkButton ID="MarkAsCompleteButton" runat="server" Text="MarkAsComplete" CommandName="MarkAsComplete" CommandArgument='' />           

Вам необходимо зарегистрировать каждый 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 за указание на это).

Это, вероятно, не рекомендуется, но вы можете сделать все в GridView асинхронно, исключив EventName в AsyncPostBackTrigger, чтобы, например,

    

Это приведет к асинхронному событию RowCommand и любому другому событию в режиме GridView. Обратите также внимание на то, что при создании ClientIDMode = «Static» в GridView это приведет к полной обратной передаче.

Мой вид сетки находится в условном режиме.

 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(); } 

MSDN указывает, что свойство UpdatePanel.ChildrenAsTriggers “[g] задает или задает значение, указывающее, обновляют ли обратные вызовы от непосредственных дочерних элементов управления UpdatePanel содержимое панели” (см. http://msdn.microsoft.com/en-us/ library / system.web.ui.updatepanel.childrenastriggers.aspx ).

Поскольку ваш LinkButton не является «непосредственным дочерним элементом управления», тогда я бы рекомендовал настроить ваш LinkButton как явный AsyncPostBackTrigger.

Ниже вашего тега попробуйте добавить следующее:

    

Поместите следующий элемент внутри элемента system.web в файл web.config

  

У меня была проблема, когда у меня была одна форма, работающая нормально ( page1 ), другая – все сообщения назад ( page2 ). Оказавшись, когда я сделал вторую страницу, я сделал слишком много cut/paste , и у нее все еще был вызов javascript в определении формы.

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

Но checkstuff не был определен на page 2 .

удалили onsubmit , и частичные сообщения начали работать.

На рабочей странице – стр. 1 был определен checkstuff , но был всего лишь заглушкой, которая не более чем возвращала true. Просто для усмешек я поставил предупреждение в checkstuff , и, конечно же, он называется для всех подчиненных, частичных или нет. И, если я изменил заглушку, чтобы просто вернуть ложь, ничего не произошло.

Точка во всем этом, javascript по-прежнему осуществляется, как если бы была отправлена ​​полная страница. Поэтому дважды проверьте свои сценарии на стороне клиента.

это может быть старым, но мое решение заключалось в том, чтобы поместить панель обновления внутри элемента itemTemplate, а также за пределы gridview.

триггер должен быть gridview, а внешний триггер должен быть gridview и PageIndexChanging. Попробуй это.

Вам необходимо зарегистрировать каждый элемент управления для каждого RowState. 1: Зарегистрируйте свои элементы управления для RowState = Alternate и Normal) 2: Зарегистрируйте свои элементы управления для RowState = Редактировать 3: …

ASPX:

         

Код позади:

 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 ); } } 
Interesting Posts

Командная строка SVG и просмотрщик файлов изображений в Linux?

Точный алгоритм рисования линии подпикселя (алгоритм растрирования)

Использование jQuery для программного перехода по ссылке

Как открыть много вкладок для многих файлов в vim?

Как использовать WinDbg для анализа дампа сбоя для приложения VC ++?

Подавление “предупреждения CS4014: поскольку этот вызов не ожидается, выполнение текущего метода продолжается …”

Имя «InitializeComponent» не существует в текущем контексте

Ссылка с UITableViewCell на родительский UITableView?

Генератор случайных чисел без дубликатов

Окончательное руководство и список книг на C ++

Chrome: как остановить перенаправление с http: // на https: //

Как остановить другие приложения, играющие музыку из моей текущей деятельности?

Может ли Django автоматически создавать связанную модель «один-к-одному»?

Как программно запускать программу запуска приложений по умолчанию?

Должны ли функции возвращать null или пустой объект?

Давайте будем гением компьютера.