UserControl 导致 UpdatePanel 中的完整回发 [英] UserControl causes full postback in UpdatePanel

查看:35
本文介绍了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 相关,但我不知道如何以其他方式处理它.我需要让其他组件知道,该节点选择已更改.我如何改进它以使其与 UpdatePanels 一起使用?

解决方案

怀疑将 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 UpdatePanels on my master page. And then, I have RadTreeViewcontrol 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 UpdatePanels?

解决方案

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

查看全文
相关文章
C#/.NET最新文章
热门教程
热门工具
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆