Полная обратная передача запускается LinkButton внутри GridView внутри UpdatePanel - PullRequest
38 голосов
/ 02 февраля 2011

У меня есть 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>

Ответы [ 8 ]

77 голосов
/ 08 февраля 2011

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

5 голосов
/ 04 сентября 2014

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

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

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

4 голосов
/ 27 декабря 2015

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

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

        }
    }

И в случае нажатия кнопки ссылки я поставил:

protected void LinkButton2_Click(object sender, EventArgs e)
    {
        UpdatePanel2.Update();
    }
1 голос
/ 09 февраля 2011

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

<xhtmlConformance mode="Transitional"/>
0 голосов
/ 14 апреля 2016

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

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

0 голосов
/ 07 января 2016

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

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

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

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

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

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

0 голосов
/ 04 июня 2015

Вам необходимо зарегистрировать каждый элемент управления для каждого 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 );      
    }
}
0 голосов
/ 08 февраля 2011

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

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

Ниже вашего тега, попробуйте добавить это:

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