问题起因:
  要编写一个 UserControl 基类, 使得下游人员可以编写 ascx 来布局,
  同时要使用一个三方 WebControl 子类来作为ascx标签的容器.思路:
  0. WebControl 并非基于模板的, 不可使用 ascx 机制(疑问).
  1. 自定义 UserControl 中创建三方 WebControl 子类,
  2. 本 UserControl 子类中的标签放入到那个三方 WebControl 中.探索控件关系和问题:控件基类namespace demo
{
  public class AjaxUserControl : UserControl
  {
    protected override void CreateChildControls()
    {
      HtmlGenericControl divHeader = new HtmlGenericControl("div");
      divHeader.ID = "divHeader";
      divHeader.Attributes["class"] = "section";
      this.Controls.Add(divHeader);      base.CreateChildControls();
      
      HtmlGenericControl divFooter = new HtmlGenericControl("div");
      divFooter.ID = "divFooter";
      divFooter.Attributes["class"] = "section";
      this.Controls.Add(divFooter);
    }
  }
}
ascx 布局:
<%@ Control AutoEventWireup="false" Inherits="demo.AjaxUserControl" %>
<div class="section">
  <span id="lbl" runat="server">信息</span>
  <div id="sub">
    <span>正文</p>
  </div>
</div>
生成了以下的 html:<div class="section">
  <span id="ctl00_ContentPlaceHolder1_ajaxtest1_lbl">信息</span>
  <div id="sub">
    <span>正文</p>
  </div>
</div>
<div id="ctl00_ContentPlaceHolder1_ajaxtest1_divHeader" class="section"></div>
<div id="ctl00_ContentPlaceHolder1_ajaxtest1_divFooter" class="section"></div>
注意到, 基类新增的那两个 div, 跟子类 ascx 标签中的是同级关系
而 usercontrol 自己没指定 html 标签.问题:
  如何使得子类 ascx 中的标签被基类创建的某个 div 包绕.缘起, 使用三方 webcontrol 中的 ajax 功能 -- MagicAjax.
她能截取内部 asp.net 控件的回发, 改为ajax call.

解决方案 »

  1.   

    模板(ascx)中的控件借助 TemplateControl 机制加载后, 实例化了, 放入内置的那个 WebControl.
      

  2.   

    好久不搞 web, 不知思路对头否, 如果走偏了, 希望大家指出来.
      

  3.   

    我建议lz自己的类就写成WebControl,这样实例化第三方WebControl也方便。外加你的类可以作为容器,让下游开发人员往你的控件里拖ascx。而且利于复用,可以编译为dll分发,而不局限于该项目中。
      

  4.   


    谢谢你.我想形成这个层次:我的类
      三方类
        外部标签的以利用那个三方类的能力, 感觉是'我的类'的 Controls 要和 三方类的 Controls 产生关系.
      

  5.   

    我觉得你就继承Plane,然后构造的时候往往自己的Controls里Add一个第三方控件实例,然后你通用性的功能写完。发布给下游开发人员去往你的控件里拖控件。
      

  6.   

    如果要在UC的模板控件外面包裹一层,可以这样做
    protected override void CreateChildControls()
    {
    HtmlGenericControl divWrapper = new HtmlGenericControl("div");
    divWrapper.ID = "divWrapper";
    divWrapper.Attributes["class"] = "section"; Control[] ctrls = new Control[this.Controls.Count];
    this.Controls.CopyTo(ctrls, 0);
    this.Controls.Clear();
    foreach (Control c in ctrls)
    divWrapper.Controls.Add(c); this.Controls.Add(divWrapper); base.CreateChildControls();
    }
      

  7.   


    还个掉包会不会对其他(状态, 事件等)产生影响.
    Control[] ctrls = new Control[this.Controls.Count];
    this.Controls.CopyTo(ctrls, 0);
    this.Controls.Clear();
    foreach (Control c in ctrls)
      divWrapper.Controls.Add(c);
    我准备放弃这个了
      

  8.   

    好久没有搞WEB了,都忘的差不多了,看来有要补习了
      

  9.   

    正道做法应该是自定义web模板控件,同意10#