Подтвердить что ты не робот

Полная обратная передача, вызванная 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>
4b9b3361

Ответ 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 );      
    }
}