UserControl вызывает полную обратную передачу в UpdatePanel - PullRequest
0 голосов
/ 24 марта 2011

Я борюсь с этой проблемой уже несколько часов, и не могу приблизиться к решению.

Дело в том, что у меня есть несколько 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 ]

1 голос
/ 30 октября 2011

Ну, у меня похожая ситуация, но она немного сложнее.

Пользовательский элемент управления, вызывающий обратную передачу, фактически добавляется динамически в зависимости от значения параметра запроса.

Я был так рад, что был добавлен параметр ClietIDMode, я не думал, что Microsoft может пропустить такую ​​проблему, как tat.

1 голос
/ 21 марта 2012

Та же проблема, с которой я сталкиваюсь сейчас ... Я могу решить эту проблему, обернув UC iFrame.

1 голос
/ 24 марта 2011

Подозреваю, что регистрация UserControl как AsyncPostbackTrigger не поможет вам продвинуться далеко вперед.UC сам по себе не является контролем обратной передачи, скорее, он содержит его.Я бы выставил древовидный элемент управления как общедоступное свойство usercontrol, а затем в коде на вашей содержащей странице зарегистрировал сам элемент управления деревом как триггер, а не UserControl.

Проверка это для аналогичной ситуации ... это не очень хорошая тема вопросов и ответов, но она показывает основную суть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...