由UpdatePanel中的GridView内部的LinkButton触发完全回发
我有一个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>
您需要将每个LinkButton注册为AsyncPostBackTrigger
。 在GridView中绑定每行之后,您需要searchLinkButton并通过代码隐藏注册它,如下所示:
protected void OrderGrid_RowDataBound(object sender, GridViewRowEventArgs e) { LinkButton lb = e.Row.FindControl("MarkAsCompleteButton") as LinkButton; ScriptManager.GetCurrent(this).RegisterAsyncPostBackControl(lb); }
这也要求为LinkButton设置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 )。
由于你的LinkButton看起来不是一个“直接的子控件”,所以我build议将你的LinkButtonconfiguration为一个明确的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 ); } }