Re: Template data is not being replaced in a Templated ASP.NET server control...
Mike Andrews <[email protected]>
| Newsgroups | gmane.comp.windows.devel.dotnet.web |
|---|---|
| Message-ID | <[email protected]> |
Adam, I decided to go ahead and call the DataBind() method in the Render method. This particular control doesn't provide any functionality at all for binding to a datasource of any kind. It's a wrapper for an ActiveX control and for several modes of viewing; I render the control completely myself based on properties. I'm also building lots of dynamic javascript and use the __doPostBack method for using the IPostBackEventHandler interface. The templates are to let the UI programmer to customize the interface but keep the previously built Javascript methods working. Thanks, Mike On 3/30/07, Adam Sills <[email protected]> wrote: > > I wouldn't recommend doing that, even though it works. I would personally > recommend anytime you use databinding syntax you force the page owner to > call your DataBind method (or just Page.DataBind). > > If you are insistent on doing automatic data binding, you can override > OnInit or OnLoad (provided they're not doing anything else) and then call > DataBind from there. > > Adam.. > > -----Original Message----- > From: Discussion of building .NET applications targeted for the Web > [mailto:[email protected]] On Behalf Of Mike Andrews > Sent: Friday, March 30, 2007 3:25 PM > To: [email protected] > Subject: Re: [DOTNET-WEB] Template data is not being replaced in a > Templated > ASP.NET server control... > > Adam, > > I've figured something else out now. > Due to the complex nature of this particular control I've had to call > DataBind() within the control itself. > If I call DataBind() in the Render() method, then I don't need to call in > on > the page. > Also, I implemented the IPostBackEventHandler method for the control and > called DataBind() in it as well. > The control does work now with the complex behavior and works as expected. > > Thanks again for your help, > Mike > > > > On 3/30/07, Adam Sills <[email protected]> wrote: > > > > Did you forget to put runat="server" on the control? > > > > -----Original Message----- > > From: Discussion of building .NET applications targeted for the Web > > [mailto:[email protected]] On Behalf Of Mike Andrews > > Sent: Friday, March 30, 2007 1:26 PM > > To: [email protected] > > Subject: Re: [DOTNET-WEB] Template data is not being replaced in a > > Templated > > ASP.NET server control... > > > > I have yet another question regarding this... > > > > I'm almost working now... > > However, when I put an asp control inside of the template, the markup is > > sending the asp:xxx control out to the page instead of the rendered > html. > > Any suggestions? > > > > Thanks, > > Mike > > > > > > > > On 3/30/07, Adam Sills <[email protected]> wrote: > > > > > > Yes. > > > > > > But like I also said, I had to add a call to DataBind() in my > codebehind > > > page. > > > > > > Here's all the code, works great. > > > > > > <%@ Page Language="C#" AutoEventWireup="true" CodeBehind=" > > Default.aspx.cs" > > > Inherits="WebApplication1._Default" %> > > > <%@ Register Assembly="WebApplication1" Namespace="WebApplication1" > > > TagPrefix="cc1" %> > > > <html xmlns="http://www.w3.org/1999/xhtml" > <head id="Head1" > > > runat="server"> > > > <title>Untitled Page</title> > > > </head> > > > <body> > > > <form id="form1" runat="server"> > > > <div> > > > <cc1:ScannerControl id="ScannerControl1_1" > > runat="server"> > > > <Template> > > > <h1><%# Container.Text %></h1> > > > </Template> > > > </cc1:ScannerControl> > > > </div> > > > </form> > > > </body> > > > </html> > > > > > > namespace WebApplication1 { > > > public partial class _Default : System.Web.UI.Page { > > > protected void Page_Load( object sender, EventArgs e ) > { > > > this.ScannerControl1_1.DataBind(); > > > } > > > } > > > } > > > > > > namespace WebApplication1 { > > > public class MyContainer : Control, INamingContainer { > > > public MyContainer( string text ) { > > > this.Text = text; > > > } > > > > > > private string _text; > > > public string Text { > > > get { return _text; } > > > set { _text = value; } > > > } > > > } > > > > > > } > > > > > > namespace WebApplication1 { > > > [ToolboxData( "<{0}:ScannerControl > > > runat=server></{0}:ScannerControl>" )] > > > public class ScannerControl : CompositeControl { > > > private ITemplate _template; > > > > > > [TemplateContainer( typeof( MyContainer ) )] > > > [PersistenceMode( PersistenceMode.InnerProperty )] > > > public ITemplate Template { > > > get { return _template; } > > > set { _template = value; } > > > } > > > > > > public override void DataBind() { > > > base.DataBind(); > > > } > > > > > > protected override void CreateChildControls() { > > > this.Controls.Clear(); > > > if( this.Template != null ) { > > > MyContainer mc = new MyContainer( "The > > > default container text!" ); > > > this.Controls.Add( mc ); > > > this.Template.InstantiateIn( mc ); > > > } > > > base.CreateChildControls(); > > > } > > > } > > > } > > > > > > And with this, here's the output: > > > > > > <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " > > > http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> > > > <html xmlns="http://www.w3.org/1999/xhtml" > <head id="Head1"><title> > > > Untitled Page > > > </title></head> > > > <body> > > > <form name="form1" method="post" action="Default.aspx" id="form1"> > > > <div> > > > <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" > > > > > > > > > > > > value="/wEPDwULLTE4NzY2NjU3OTEPZBYCAgMPZBYCAgEPZBYCZg9kFgJmDxUBG1RoZSBkZWZhd > > > Wx0IGNvbnRhaW5lciB0ZXh0IWRkSSdc9mE3KlCrYB94vl7I3Cok4f8=" /> > > > </div> > > > > > > <div> > > > <span id="ScannerControl1_1"> > > > <h1>The default container text!</h1> > > > </span> > > > </div> > > > </form> > > > </body> > > > </html> > > > > > > -----Original Message----- > > > From: Discussion of building .NET applications targeted for the Web > > > [mailto:[email protected]] On Behalf Of Mike Andrews > > > Sent: Friday, March 30, 2007 9:45 AM > > > To: [email protected] > > > Subject: Re: [DOTNET-WEB] Template data is not being replaced in a > > > Templated > > > ASP.NET server control... > > > > > > Adam, > > > > > > Thank you for your replies. > > > > > > However, I cannot get any of your examples to work. I still the get > > same > > > effect as before. > > > One of the things I specifically tried was the <%# Container.GetType > > > ().Name > > > %> and it worked as before. > > > It's replaced with nothing instead of the name of the object. > > > > > > Were you able to get them to work in your environment? > > > > > > Thanks, > > > Mike > > > > > > > > > On 3/29/07, Adam Sills <[email protected]> wrote: > > > > > > > > Your code modified. Note all I've done is change what's in the <%# > %> > > > > block > > > > and make ScannerControl inherit from CompositeControl. > > > > > > > > .aspx: > > > > > > > > <cc1:ScannerControl id="ScannerControl1_1" runat="server"> > > > > <Template> > > > > <h1><%# Container.GetType().Name %></h1> > > > > </Template> > > > > </cc1:ScannerControl> > > > > > > > > Scanner control: > > > > > > > > [ToolboxData( "<{0}:ScannerControl > runat=server></{0}:ScannerControl>" > > > )] > > > > public class ScannerControl : CompositeControl { > > > > private ITemplate _template; > > > > > > > > [TemplateContainer( typeof( MyContainer ) )] > > > > [PersistenceMode( PersistenceMode.InnerProperty )] > > > > public ITemplate Template { > > > > get { return _template; } > > > > set { _template = value; } > > > > } > > > > > > > > protected override void CreateChildControls() { > > > > this.Controls.Clear(); > > > > if( this.Template != null ) { > > > > MyContainer mc = new MyContainer( "The > default > > > > container text!" ); > > > > this.Controls.Add( mc ); > > > > this.Template.InstantiateIn( mc ); > > > > } > > > > base.CreateChildControls(); > > > > } > > > > } > > > > > > > > -----Original Message----- > > > > From: Discussion of building .NET applications targeted for the Web > > > > [mailto:[email protected]] On Behalf Of Mike Andrews > > > > Sent: Thursday, March 29, 2007 4:06 PM > > > > To: [email protected] > > > > Subject: Re: [DOTNET-WEB] Template data is not being replaced in a > > > > Templated > > > > ASP.NET server control... > > > > > > > > Thanks for the response Adam. > > > > > > > > Would you be able to provide an example? > > > > I'm not sure what you mean about the DataBind on the scanner > control. > > > > > > > > Thanks, > > > > Mike > > > > > > > > > > > > On 3/29/07, Adam Sills <[email protected]> wrote: > > > > > > > > > > You have two problems. > > > > > > > > > > 1. You're not calling DataBind on your scanner control > > > > > 2. WebControl by itself does not loop through its child controls > and > > > > call > > > > > DataBind on them in its DataBind call. You need to do that > yourself > > or > > > > > inherit from CompositeControl instead. > > > > > > > > > > Adam.. > > > > > > > > > > -----Original Message----- > > > > > From: Discussion of building .NET applications targeted for the > Web > > > > > [mailto:[email protected]] On Behalf Of Mike Andrews > > > > > Sent: Thursday, March 29, 2007 3:47 PM > > > > > To: [email protected] > > > > > Subject: [DOTNET-WEB] Template data is not being replaced in a > > > Templated > > > > > ASP.NET server control... > > > > > > > > > > Guys, > > > > > > > > > > I'm really lost now. I cannot, I repeat cannot, get the data in > my > > > > > container control that represents the template to work. > > > > > If you notice in my markup, I have this: <%# Container.Text% > >. When > > > > the > > > > > template control is created (MyContainer) and I call the > > Instantiate, > > > > this > > > > > value is not replaced with the message "The default container > text!" > > > as > > > > it > > > > > should have been, but instead is replaced with nothing. > > > > > > > > > > Any help would be most appreciated. I'm really at my wits end > with > > > this > > > > > one. > > > > > > > > > > Thanks, > > > > > Mike > > > > > > > > > > Here's my asp.net markup: > > > > > > > > > > <%@ Page Language="C#" AutoEventWireup="true" CodeFile=" > > > Default.aspx.cs > > > > " > > > > > Inherits="_Default" %> > > > > > <%@ Register Assembly="Scanner" Namespace="Scanner" > TagPrefix="cc1" > > %> > > > > > <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " > > > > > http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> > > > > > <html xmlns="http://www.w3.org/1999/xhtml" > > > > > > <head runat="server"> > > > > > <title>Untitled Page</title> > > > > > </head> > > > > > <body> > > > > > <form id="form1" runat="server"> > > > > > <div> > > > > > <cc1:ScannerControl id="ScannerControl1_1" runat="server"> > > > > > <Template> > > > > > <h1><%# Container.Text %></h1> > > > > > </Template> > > > > > </cc1:ScannerControl> > > > > > </div> > > > > > </form> > > > > > </body> > > > > > </html> > > > > > > > > > > > > > > > Here's the result of the page when it's run: > > > > > > > > > > <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " > > > > > http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> > > > > > <html xmlns="http://www.w3.org/1999/xhtml" > > > > > > <head><title> > > > > > Untitled Page > > > > > </title></head> > > > > > <body> > > > > > <form name="form1" method="post" action="Default.aspx" > > id="form1"> > > > > > <div> > > > > > <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" > > > > > value="/wEPDwUJNTgwMjcwMjU1ZGTpLl3HHZKhrXybhi5mD/cUEBCBwQ==" /> > > > > > </div> > > > > > <div> > > > > > <span id="ScannerControl1_1"> > > > > > <h1></h1> > > > > > </span> > > > > > </div> > > > > > </form> > > > > > </body> > > > > > </html> > > > > > > > > > > > > > > > Here is a really scaled down version of my code: > > > > > > > > > > > > > > > [ToolboxData("<{0}:ScannerControl > > > > runat=server></{0}:ScannerControl>")] > > > > > public class ScannerControl : WebControl { > > > > > private ITemplate _template; > > > > > [TemplateContainer(typeof(MyContainer))] > > > > > [PersistenceMode(PersistenceMode.InnerProperty)] > > > > > public ITemplate Template { > > > > > get { return _template; } > > > > > set { _template = value; } > > > > > } > > > > > > > > > > protected override void CreateChildControls() { > > > > > this.Controls.Clear(); > > > > > if (this.Template != null) { > > > > > MyContainer mc = new MyContainer("The default > > container > > > > > text!"); > > > > > this.Template.InstantiateIn(mc); > > > > > this.Controls.Add(mc); > > > > > } > > > > > base.CreateChildControls(); > > > > > } > > > > > } > > > > > > > > > > public class MyContainer : Control, INamingContainer { > > > > > public MyContainer(string text) { > > > > > this.Text = text; > > > > > } > > > > > > > > > > private string _text; > > > > > public string Text { > > > > > get { return _text; } > > > > > set { _text = value; } > > > > > } > > > > > } > > > > > > > > > > =================================== > > > > > This list is hosted by DevelopMentorR http://www.develop.com > > > > > > > > > > View archives and manage your subscription(s) at > > > > > http://discuss.develop.com > > > > > > > > > > =================================== > > > > > This list is hosted by DevelopMentor(r) http://www.develop.com > > > > > > > > > > View archives and manage your subscription(s) at > > > > > http://discuss.develop.com > > > > > > > > > > > > > =================================== > > > > This list is hosted by DevelopMentorR http://www.develop.com > > > > > > > > View archives and manage your subscription(s) at > > > > http://discuss.develop.com > > > > > > > > =================================== > > > > This list is hosted by DevelopMentor(r) http://www.develop.com > > > > > > > > View archives and manage your subscription(s) at > > > > http://discuss.develop.com > > > > > > > > > > =================================== > > > This list is hosted by DevelopMentorR http://www.develop.com > > > > > > View archives and manage your subscription(s) at > > > http://discuss.develop.com > > > > > > =================================== > > > This list is hosted by DevelopMentor(r) http://www.develop.com > > > > > > View archives and manage your subscription(s) at > > > http://discuss.develop.com > > > > > > > =================================== > > This list is hosted by DevelopMentorR http://www.develop.com > > > > View archives and manage your subscription(s) at > > http://discuss.develop.com > > > > =================================== > > This list is hosted by DevelopMentor(r) http://www.develop.com > > > > View archives and manage your subscription(s) at > > http://discuss.develop.com > > > > =================================== > This list is hosted by DevelopMentorR http://www.develop.com > > View archives and manage your subscription(s) at > http://discuss.develop.com > > =================================== > This list is hosted by DevelopMentor(r) http://www.develop.com > > View archives and manage your subscription(s) at > http://discuss.develop.com > =================================== This list is hosted by DevelopMentor® http://www.develop.com View archives and manage your subscription(s) at http://discuss.develop.com