【问题标题】:What's the difference in behavior between adding a control to an ASPX page directly, loading a control programmatically & adding to a placeholder?直接将控件添加到 ASPX 页面、以编程方式加载控件和添加到占位符之间的行为有什么区别?
【发布时间】:2008-12-01 18:01:41
【问题描述】:

直接将控件添加到 ASPX 页面与以编程方式加载控件并添加到占位符之间在行为上是否存在差异?

控件继承自System.Web.UI.WebControls.DataBoundControl

我问的原因是当我将它添加到 ASPX 页面时,我有一个可以工作的控件,如下所示:

...
<blah:GoogleMap ID="GoogleMap1" runat="server" Width="640px" Height="600px" ... DataSourceID="_odsMarkers" DataAddressField="Address" DataTextField="Description">
</blah:GoogleMap>
...

但当我在代码隐藏页面中使用以下内容时不会:

GoogleMap map = (GoogleMap)this.LoadControl(typeof(GoogleMap), new object[] { });
//... set properties
this.placeholder1.Controls.Add(map); //add to placeholder

有人知道为什么会这样吗?

【问题讨论】:

  • 可能是愚蠢的问题,但页面中已添加占位符?可能还想定义“作品”。

标签: asp.net controls


【解决方案1】:

如果您在标记中定义或以编程方式添加,则控制树最终会相同。然而,控制实现者有足够的空间来搞砸。

你可以去看看ASP.NET是如何编译aspx的:

C:\Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files

将控件添加到页面的时间可能是个问题。通常的模式是在 CreateChildControls 方法的重载中添加控件。如果控件需要解析视图状态,您需要确保在初始化期间调用它,例如通过调用 EnsureChildControls。

添加到忍者的调试提示。如果您以相同的方式添加标签,是否有任何区别。出现了吗?

【讨论】:

    【解决方案2】:

    这是用户控件还是服务器控件?

    如果它是一个用户控件,它们应该通过它们的路径而不是它们的类型来加载:

    GoogleMap map = (GoogleMap)this.LoadControl("~/Controls/GoogleMap.ascx");
    

    如果是服务器控制,那么你可以新建一个实例:

    GoogleMap map = new GoogleMap();
    

    在您拥有实例并将其添加到控件树(通过将其插入 PlaceHolder)之后,它的执行应该与在标记中声明时相同。

    【讨论】:

      【解决方案3】:

      如果您在 LoadControl 调用之外设置属性,为什么要创建新的空对象数组而不是仅使用具有一个参数的重载?

      另外,如果您将调试器附加到它并单步执行,在调用 Controls.Add() 之前,您是否注意到控件有什么奇怪的地方?是否抛出异常?如果有,是哪一个?如果不是,浏览器中的标记在占位符所在的位置是什么样的?

      【讨论】:

        【解决方案4】:

        “Works”有点模棱两可,但如果你的意思是,事件处理程序永远不会执行,你需要在页面 onload 事件中加载它。

        【讨论】:

          【解决方案5】:

          如果控件需要使用 viewstate,您必须确保在 Page_Load 事件之前将其添加到页面,否则 viewstate 将不会被填充,并且很可能事件和其他项目将无法正常工作。

          【讨论】:

            【解决方案6】:

            一个重要的区别是,如果您动态创建控件,默认情况下,您不会从皮肤集中获得任何值。必须手动调用 control.ApplyStyleSheetSkin(page): http://msdn.microsoft.com/en-us/library/system.web.ui.control.applystylesheetskin.aspx

            【讨论】:

              猜你喜欢
              • 2011-02-08
              • 2010-12-26
              • 2011-12-06
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-10-24
              • 2015-12-29
              • 2010-11-09
              相关资源
              最近更新 更多