UserControl在UpdatePanel中导致完全回发

时间:2011-03-24 18:59:01

标签: asp.net vb.net 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>
    <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>

用户控件非常简单:

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

还有一些代码:

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

我不知道的是:为什么这会导致完全回发而不是部分?我怀疑这可能与提升我的SelectedNodeChange有关,但我不知道如何以其他方式处理它。我需要让其他组件知道,节点选择已更改。如何改进它以使其与UpdatePanel s一起使用?

3 个答案:

答案 0 :(得分:1)

怀疑将UserControl注册为AsyncPostbackTrigger并不会让你走得太远。 UC本身不是一个回发控件,而是包含一个。我将树控件公开为usercontrol的公共属性,然后在包含页面的代​​码后面,将树控件本身注册为触发器,而不是UserControl

检查this是否有类似情况......这不是一个很好的Q&amp; A线程,但它显示了基本要点。

答案 1 :(得分:1)

嗯,我有类似的情况,但它有点复杂。

实际上会根据请求参数值动态添加导致回发的用户控件。

我很高兴添加了ClietIDMode参数,我不认为微软会忽视像tat这样的问题。

答案 2 :(得分:1)

我现在面临的同样问题......我可以通过使用iFrame包装UC来解决这个问题。