Groups | Blog | Home
all groups > asp.net building controls > november 2005 >

asp.net building controls : ASP.NET 2.0 User Control that implements a template


Wes
11/18/2005 3:00:02 PM
I have created a user control in ASP.NET 2.0 that utilizes ITemplate. The
control has no issues (displays fine in a browser) until I try to go into
design mode on the aspx page that is implementing the control. The aspx page
says "Can not switch views: Content is not allowed between the openening and
closing tags for element 'Section'". I have include a simplified version of
the control and the implementation on the aspx page. Any insite into enabling
the user control for view in the design mode of an aspx page would be greatly
appreciated.

user control:
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="Section.ascx.cs"
Inherits="Common_FormSections_Section" %>

<hr />
<asp:PlaceHolder ID="contentholder" runat="server"></asp:PlaceHolder>
<hr />

codebehind:

using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

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

protected override void CreateChildControls()
{
if (null != Header)
Content.InstantiateIn(contentholder);
}


protected void Page_Load(object sender, EventArgs e)
{

}

private ITemplate _contentTemplate = null;

[TemplateInstance(TemplateInstance.Single)]
public ITemplate Content
{
get
{
return _contentTemplate;
}
set
{
_contentTemplate = value;
}
}

}

aspx implimentation:
The register tag has been intentional excluded

<uc1:Section ID="Section1" runat="server">
<Content>
This is content

</Content>

</uc1:Section>

Wes
11/18/2005 3:10:07 PM
The CreateChildControls method should have read

protected override void CreateChildControls()
{
if (null != Content)
Content.InstantiateIn(contentholder);
}
}


[quoted text, click to view]
Brock Allen
11/18/2005 3:38:31 PM
UserControls (ASCX files) aren't typically used this way. Usually a Composite
control is used. IOW, and IMO, you don't need the ASCX portion of this control.
In your CreateChildControls add a LiteralControl with the <hr>, then add
your content, then add another LiteralControl with the last <hr>.

-Brock
DevelopMentor
http://staff.develop.com/ballen

[quoted text, click to view]

Wes
11/18/2005 3:51:05 PM
Thank you for the response. I am only trying to implement an example from MSDN

http://msdn.microsoft.com/library/en-us/cpguide/html/cpconCreatingTemplatedUserControl.asp?frame=true

of course in the end I will implement something far more complex.

The issue is not the implementation but rather displaying the aspx page in
design mode.

[quoted text, click to view]
Brock Allen
11/19/2005 9:40:31 AM
Sure, I understand. The reason it doesn't work is that the ASCX is the concrete
class that's being put on the page and it doesn't have the [ParseChildren(true)]
attribute (since the class is gen'd form the ASCX) and all the other things
like ControlDesigers that are necessary to make the deisgn mode work. If
you just make your own class (in a .cs file) and don't use the ASCX you'll
be able to put those attrribues on yourself. Check out "Developing Microsoft
ASP.NET Server Controls and Components", by Nikhil Kothari and Vandana Datye
from MS Press as it describes in detail all of what needs to be done to support
the designer.

-Brock
DevelopMentor
http://staff.develop.com/ballen

[quoted text, click to view]

AddThis Social Bookmark Button