其中包含内容的Web用户控件

时间:2010-08-11 06:12:26

标签: c# asp.net web-controls webusercontrol

用法:

    <uc1:WindowControl ID="Window_ExpoNews" runat="server" Height="265px" Title="Expo News"
    Width="100%">              
    <ContentTemplate> 
        This content will show in the center cell of this user control.
        <br />
        I can even add real controls.
        <asp:TextBox ID="TextBox1" runat="server" />
        <br />
        Good times.
    </ContentTemplate>
</uc1:WindowControl> 

控制来源:

 <asp:Panel ID="Panel2" 
           runat="server">                 
       </div>
</asp:Panel>
<asp:PlaceHolder runat="server" ID="BodyControlSpace"/>

代码背后:

public partial class Componants_WebUserControl : System.Web.UI.UserControl{

private ITemplate _ContentTemplate;

[PersistenceMode(PersistenceMode.InnerProperty)]
public ITemplate ContentTemplate
{
    get { return _ContentTemplate; }
    set { _ContentTemplate = value; }
}

protected override void OnInit(EventArgs e)
{
    base.OnInit(e);
    _ContentTemplate.InstantiateIn(BodyControlSpace); 
} 

public Unit Width
{
    get {return Panel1.Width;}
    set {Panel1.Width = value;}
}

public Unit Height
{
    get {return Panel1.Height;}
    set {Panel1.Height = value;}
}

public string Title
{
    get {return lblTitle.Text;}
    set {lblTitle.Text = value;}
}

}

问题是它给了我以下错误:
你调用的对象是空的。 描述:执行当前Web请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.NullReferenceException:未将对象引用设置为对象的实例。

来源错误:

第21行:{
第22行:base.OnInit(e);
第23行:_ContentTemplate.InstantiateIn(BodyControlSpace);
第24行:} 第25行:

2 个答案:

答案 0 :(得分:1)

最后我发现没有人说我可以在那边添加“if”:

protected override void OnInit(EventArgs e)
{
    base.OnInit(e);
    if (_ContentTemplate != null)
         _ContentTemplate.InstantiateIn(BodyControlSpace); 
} 

答案 1 :(得分:0)

如何从Web控件中的面板类派生。它会给你和你的控制div,但也可以让你把内容放在里面。试试这样:

public WindowControl : Panel
{
   // ...
}

或者,如果您不希望在html中使用Literal作为基本控件进行任何额外更改:

public WindowControl : Literal
{
   // ...
}