UserControl 导致 UpdatePanel 中的完整回发
[英] UserControl causes full postback in UpdatePanel
本文介绍了UserControl 导致 UpdatePanel 中的完整回发的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我已经与这个问题斗争了几个小时,但我并没有接近解决方案.
问题是:我的母版页上的 UpdatePanel
很少.然后,我在页面上有 RadTreeView
控件,每次单击节点时都会导致部分回发.那里一切正常.
由于我在其他一些页面上使用了相同的树,因此我将此功能移至 UserControl
.我以前做过的东西,所以没问题.将一些代码移动到 ascx
,创建了一些事件.一切对我来说总是很好.但不是现在.
RadTreeView
嵌套在 UserControl
内,此控件在母版页上带有更新面板,见下图:
<asp:Panel ID="pnlContentWrapper" runat="server" CssClass="ContentWrapper"><div id="HeaderBreadCrumb"><asp:ContentPlaceHolder ID="HeaderBreadCrumbContent" runat="server"/>
<div id="HeaderMenu"><asp:UpdatePanel ID="upnlTreeMenu" runat="server"><内容模板><asp:ContentPlaceHolder ID="HeaderMenuContent" runat="server"/></内容模板><触发器><asp:AsyncPostBackTrigger ControlID="treeProductTree"/></触发器></asp:UpdatePanel>
<div id="TreeDiv"><fp:ProductTree ID="treeProductTree" runat="server"/>
<asp:Panel ID="ContentDiv" ClientIDMode="Static" runat="server"><asp:UpdatePanel ID="upnlTreeContent" runat="server"><内容模板><asp:ContentPlaceHolder ID="TreePageContent" runat="server"/></内容模板><触发器><asp:AsyncPostBackTrigger ControlID="treeProductTree"/></触发器></asp:UpdatePanel></asp:面板></asp:面板>
而且用户控制非常简单:
<%@ Control Language="vb" AutoEventWireup="false" CodeBehind="ProductTree.ascx.vb"继承=产品树"%><div><telerik:RadTreeView ID="treeProductTree" ClientIDMode="Static" runat="server" EnableDragAndDrop="false"SkinID="CustomSkin" CssClass="MasterProductTree" DataFieldID="NodeId" DataFieldParentID="NodeParentId"DataTextField="NodeName" DataValueField="NodeId"/>
后面还有一些代码:
导入 Telerik.Web.UI
公共类产品树继承 System.Web.UI.UserControl公共事件 NodeExpand As EventHandler(Of ProductTreeNodeExpandEventArgs)公共事件 SelectedNodeChange 作为 EventHandler受保护的子 ProductTree_NodeExpand(ByVal sender As Object, ByVal e As RadTreeNodeEventArgs) _处理 treeProductTree.NodeExpandDim nodeId As Integer = CInt(e.Node.Value)Dim evetArgs = New ProductTreeNodeExpandEventArgs(nodeId)RaiseEvent NodeExpand(Me, evetArgs)//'一些逻辑结束子Protected Sub ProductTree_OnNodeClick(ByVal sender As Object, ByVal e As RadTreeNodeEventArgs) _处理 treeProductTree.NodeClickRaiseEvent SelectedNodeChange(Me, New System.EventArgs())结束子结束类
我不知道的是:为什么这会导致完全回发而不是部分回发?我怀疑它可能与提高我的 SelectedNodeChange
相关,但我不知道如何以其他方式处理它.我需要让其他组件知道,该节点选择已更改.我如何改进它以使其与 UpdatePanel
s 一起使用?
解决方案
怀疑将 UserControl
注册为 AsyncPostbackTrigger
不会让你走得太远.UC 本身不是回发控件,而是包含一个.我会将树控件公开为用户控件的公共属性,然后在包含页面的代码后面,将树控件本身注册为触发器,而不是 UserControl
.
检查this是否有类似的情况……这不是一个很好的问答线程,但它显示了基本要点.
I'm fighting this problem for few hours now and I'm not getting any closer to solution.
The thing is: I'm having few UpdatePanel
s on my master page. And then, I have RadTreeView
control on the page, that should cause partial postback each time node is clicked. Everything works fine there.
Since I'm using the same tree on some other pages, I moved this functionality to UserControl
. Stuff I've done before, so no problem. Moved some code to ascx
, created some events. Everything always worked for me well. But not now.
RadTreeView
is nested inside UserControl
, and this control on master page with update panels, see below:
<asp:Panel ID="pnlContentWrapper" runat="server" CssClass="ContentWrapper">
<div id="HeaderBreadCrumb">
<asp:ContentPlaceHolder ID="HeaderBreadCrumbContent" runat="server" />
</div>
<div id="HeaderMenu">
<asp:UpdatePanel ID="upnlTreeMenu" runat="server">
<ContentTemplate>
<asp:ContentPlaceHolder ID="HeaderMenuContent" runat="server" />
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="treeProductTree" />
</Triggers>
</asp:UpdatePanel>
</div>
<div id="TreeDiv">
<fp:ProductTree ID="treeProductTree" runat="server" />
</div>
<asp:Panel ID="ContentDiv" ClientIDMode="Static" runat="server">
<asp:UpdatePanel ID="upnlTreeContent" runat="server">
<ContentTemplate>
<asp:ContentPlaceHolder ID="TreePageContent" runat="server" />
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="treeProductTree" />
</Triggers>
</asp:UpdatePanel>
</asp:Panel>
</asp:Panel>
And the user control is really simple:
<%@ Control Language="vb" AutoEventWireup="false" CodeBehind="ProductTree.ascx.vb"
Inherits="ProductTree" %>
<div>
<telerik:RadTreeView ID="treeProductTree" ClientIDMode="Static" runat="server" EnableDragAndDrop="false"
SkinID="CustomSkin" CssClass="MasterProductTree" DataFieldID="NodeId" DataFieldParentID="NodeParentId"
DataTextField="NodeName" DataValueField="NodeId" />
</div>
And some code behind:
Imports Telerik.Web.UI
Public Class ProductTree
Inherits System.Web.UI.UserControl
Public Event NodeExpand As EventHandler(Of ProductTreeNodeExpandEventArgs)
Public Event SelectedNodeChange As EventHandler
Protected Sub ProductTree_NodeExpand(ByVal sender As Object, ByVal e As RadTreeNodeEventArgs) _
Handles treeProductTree.NodeExpand
Dim nodeId As Integer = CInt(e.Node.Value)
Dim evetArgs = New ProductTreeNodeExpandEventArgs(nodeId)
RaiseEvent NodeExpand(Me, evetArgs)
//'some logic
End Sub
Protected Sub ProductTree_OnNodeClick(ByVal sender As Object, ByVal e As RadTreeNodeEventArgs) _
Handles treeProductTree.NodeClick
RaiseEvent SelectedNodeChange(Me, New System.EventArgs())
End Sub
End Class
What I don't know is: why is this causing full postback instead of partial? I suspect that it may have something to do with raising my for SelectedNodeChange
, but I don't know how to deal with it other way. I need to let other components know, that node selection changed. How can I improve this to make it work with UpdatePanel
s?
解决方案
Suspect that registering a UserControl
as an AsyncPostbackTrigger
is not going to get you very far. The UC itself is not a postback control, rather, it contains one. I would expose the tree control as a public property of the usercontrol, and then in code behind in your containing page, register the tree control itself as the trigger, rather than the UserControl
.
Check this for a similar situation... it's not a great Q&A thread but it shows the basic gist.
这篇关于UserControl 导致 UpdatePanel 中的完整回发的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!