【问题标题】:Custom Control loads a user control; Postback events are not triggered自定义控件加载用户控件;不触发回发事件
【发布时间】:2010-10-15 11:59:40
【问题描述】:

我有一个加载用户控件的自定义控件(编译为 DLL)。 (即,自定义控件执行 LoadControl)在用户控件中是一个按钮和一个文本框。我连接了按钮的点击事件。

我在文本框中输入了一个值。当我单击按钮时,页面会进行回发。我的用户控件知道发生了回发,因为 Page.IsPostBack = true。但是,按钮的单击事件从未触发,并且我的文本框也丢失了我输入的值。

有人对可能发生的事情有任何想法吗?

编辑: 我对此进行了测试,并将 SharePoint 排除在外;我能够重现它,因此我删除了对 SharePoint 的所有引用。

【问题讨论】:

    标签: c# asp.net postback


    【解决方案1】:

    如果您正在动态加载用户控件,则必须在每次页面加载时重新加载它(无论是否回发),以便 .net 处理器知道在哪里连接提交事件。

    【讨论】:

    • 在自定义控件的 RenderContents 部分中。
    • 我认为现在为时已晚。控件应在 Page_Load 或之前加载,最好在 OnInit 上加载。
    • 好吧,我可能对自定义控件太陌生了...由于我正在使用 LoadControl 动态加载 UserControl,我将如何比这更早地“添加”它?我基本上是使用 HTML 编写器在页面上获取它。我是否将它添加到 base.Controls 集合中才能真正“添加”它?
    • 是的。覆盖 OnInit、Load 并将其添加到 Controls 集合中。连接您可能想要处理的任何事件,例如按钮 Click 等。
    • 这最终奏效了。我覆盖了页面初始化,然后我没有让renderControls 执行LoadControl,而是遍历了所有控件并告诉每个控件自己渲染。感谢您的帮助。
    【解决方案2】:

    加载用户控件的一种方法是覆盖 CreateChildControl,调用 base.CreateChildControls,然后调用您的 LoadControl 方法。如果您需要将 UserControl 放置在特定位置,请在页面上放置一个 PlaceHolder,并将您的控件添加到占位符控件集合中。

    您也可以直接将用户控件添加到标记中。

    这样注册控件:

    <%@ Register Src="~/path/ControlName.ascx" TagName="tagName" TagPrefix="myPrefix" %>
    

    然后添加如下:

    <myPrefix:tagName ID="myId" runat="server"/>
    

    【讨论】:

      【解决方案3】:

      如果您要进行数据绑定,则需要检查您是否只在 !Page.IsPostBack 上这样做,当您进行数据绑定时,您会从回发中清除所有“已保存”状态。

      【讨论】:

      • 我不是数据绑定。 UC的page_load为空。
      【解决方案4】:

      听起来您没有在回发时重新创建控件。您需要在 Page_Init 期间添加控件才能加载视图状态。

      【讨论】:

      • 自定义控件(我作为 DLL 编写的那个)被加载到页面的标记中。 ASP.NET 在加载时正在处理......所以我认为这不是问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-16
      • 2011-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多