由UpdatePanel中的GridView内部的LinkBut​​ton触发完全回发

我有一个UpdatePanel里面的GridView。 在模板字段中是用于标记项目的button。 在function上,这工作正常,但button总是触发一个完整的页面回发,而不是部分回发。 我如何获得button来触发部分回发?

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

您需要将每个LinkBut​​ton注册为AsyncPostBackTrigger 。 在GridView中绑定每行之后,您需要searchLinkBut​​ton并通过代码隐藏注册它,如下所示:

 protected void OrderGrid_RowDataBound(object sender, GridViewRowEventArgs e) { LinkButton lb = e.Row.FindControl("MarkAsCompleteButton") as LinkButton; ScriptManager.GetCurrent(this).RegisterAsyncPostBackControl(lb); } 

这也要求为LinkBut​​ton设置ClientIDMode="AutoID" ,正如这里所提到的(感谢RăzvanPanda指出这一点)。

这可能不被build议,但是你可以通过排除AsyncPostBackTrigger上的EventName来asynchronous地使GridView上的所有东西都工作,例如

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

这将使RowCommand事件和GridView上的任何其他事件asynchronous触发。 还要注意,当你在GridView上做ClientIDMode =“Static”的时候,会导致完整的回发。

我的网格视图是在条件模式。

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

在链接button的点击事件中,我把:

 protected void LinkButton2_Click(object sender, EventArgs e) { UpdatePanel2.Update(); } 

将以下元素放在web.config文件的system.web元素中

 <xhtmlConformance mode="Transitional"/> 

MSDN指定UpdatePanel.ChildrenAsTriggers属性“[g]取消或设置一个值,该值指示UpdatePanel控件的直接子控件的回发是否更新面板的内容”(请参阅http://msdn.microsoft.com/zh-cn/ library / system.web.ui.updatepanel.childrenastriggers.aspx )。

由于你的LinkBut​​ton看起来不是一个“直接的子控件”,所以我build议将你的LinkBut​​tonconfiguration为一个明确的AsyncPostBackTrigger。

在您的</ ContentTemplate>标签下方,尝试添加以下内容:

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

我有一个问题,我有一个表单工作正常(第1 page1 ),另一个完整的职位背后(第2页)。 当我做第二页时,发现我已经做了太多的cut/paste ,并且它仍然在表单定义中有一个javascript调用。

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

但是checkstuff没有在page 2定义。

删除了onsubmit ,部分职位开始工作。

在工作页面 – 页面1中, checkstuff被定义了,但是只是一个存根,只不过是返回true而已。 只是为了咧嘴笑,我在戒备中提了一个戒备,果然,这是要求所有提交,部分或没有。 而且,如果我将存根改为只是返回false,则什么也没有发生。

指出所有这一切,JavaScript仍然行使,就像一个完整的页面正在提交。 所以仔细检查你的客户端脚本。

这可能是旧的,但我的解决scheme是把一个更新面板内的itemTemplate和一个外面的gridview。

触发器应该是gridview,外部触发器应该是gridview和PageIndexChanging。 试试看

您需要为每个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 ); } }