How to dynamically render asp.net controls from string?

Up vote 1 down vote favorite share g+ share fb share tw.

Let's say I have a string that I retrieve from a DB like: "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et {{Hyperlink|navigateurl='/foo. Aspx'}} dolore magna aliquyam. " This string may now get assigned to the Text-property of a label.

What I want is to parse {{Hyperlink|navigateurl='/foo. Aspx'}} and replace it with and assign the whole text including the HyperLink-Control to the Label. Is that even possible?

I think I could use reflection to create the control and set the properties. (the HyperLink-Control was just an example) But can I manage to insert the asp.net control back into the string to ensure the hyperlinks rendering as server contorl? I hope you understand what I want.

If not, feel free to post comments. Edit1: what do you mean by "assign the whole text including the HyperLink-Control to the Label. "?

Can you explain a bit, the reason for doing so? I think it won't work to assign the control into the string, because a asp.net control cannot be fit into a string. After some thinking I found a way to achieve my goal.

That would be to create a placeholder (I name it A). Therein some Literal control will be added. In addition I would create a placeholder (I name it B), add my Hyperlink into B, and add A into B.

But I think is way to overkill. The reason why I started thinking about this, was to gain access to Server. MapPath without replacing occurences in the string.

I want to be able to use relative paths in my CMS, that get rendered like the NavigateUrl property from a hyperlink. Nevertheless I think my question with the dynamically creation is worth thinking about c# asp.net controls rendering link|improve this question edited Feb 28 '10 at 14:43 asked Feb 28 '10 at 13:53citronas4,27431142 90% accept rate.

What do you mean by "assign the whole text including the HyperLink-Control to the Label. "? Can you explain a bit, the reason for doing so?

– Asad Butt Feb 28 '10 at 14:02.

Public class Program { static void Main(string args) { ParserBase parser = new ParserBase(); Console. WriteLine(parser. DynamicRenderControl(parser.

Parse(""))); Console.ReadLine(); } } public class ParserBase { public virtual Dictionary Parse(string stringToParse) { //... // parse the stringToParse //... Dictionary parsedPropertiesValues = new Dictionary(); parsedPropertiesValues. Add("NavigateUrl", @"http://www.koolzers.net"); return parsedPropertiesValues; } protected virtual void SetProperty(T obj, string propertyName, string value) where T : WebControl { typeof(T). GetProperty(propertyName).

SetValue(obj, value, null); } public string DynamicRenderControl(Dictionary parsedPropertiesValues) where T : WebControl, new() { StringBuilder sb = new StringBuilder(); using (T control = new T()) { foreach (KeyValuePair keyValue in parsedPropertiesValues) { SetProperty(control, keyValue. Key, keyValue. Value); } using (StringWriter tw = new StringWriter(sb)) { using (HtmlTextWriter w = new HtmlTextWriter(tw)) { control.

RenderControl(w); } } } return sb.ToString(); } }.

Nice one. Haven't though of rendering the subcontrol and adding the html output back into the string. – citronas Feb 28 '10 at 14:59 You are a genius ;) – citronas Mar 5 '10 at 19:36.

I believe this is possible if you split your text into 2 labels instead of one. I wrote up a quick sample to demonstrate. When you parse your string from the db, if there is text before and after your dynamic control than just set the BeginText and EndText properties of DynamicControl.

Public class DynamicControl { public String BeginText { get; set; } public String EndText { get; set; } public String ControlName { get; set; } public Dictionary ControlProperties { get; set; } } public partial class _Default : System.Web.UI. Page { protected override void OnInit(EventArgs e) { base. OnInit(e); //read strings from db var dynamicControlStrings = GetStringsFromDB(); //parse strings into list of dynamicControls var dynamicControls = ParseStringsToDynamicControls(dynamicControlStrings); foreach (var dynamicControl in dynamicControls) { CreateControl(dynamicControl.

BeginText, dynamicControl. EndText, dynamicControl. ControlName, dynamicControl.

ControlProperties); } } private void CreateControl(string beginText, string endText, string controlName, Dictionary controlProperties) { var beginLabel = new Label() { Text = beginText }; var dynamicControl = GenerateDynamicControl(controlName, controlProperties); var endLabel = new Label() { Text = endText }; var span = new HtmlGenericControl("span"); span.Controls. Add(beginLabel); span.Controls. Add(dynamicControl); span.Controls.

Add(endLabel); form1.Controls. Add(span); } //you would create your dynamic control here (such as the hyperlink) based on the control name and use reflection to set the properties private WebControl GenerateDynamicControl(string controlName, Dictionary controlProperties) { } protected void Page_Load(object sender, EventArgs e) { } }.

Yep, somethink like that came into my mind. What do you think, how efficient will this be? – citronas Feb 28 '10 at 14:46 1 Reflection is definitely slower than direct access of some object but I think this blog post sums up a lot of the common misconceptions west-wind.com/weblog/posts/351.aspx.

I assume you arn't going to be auto-generating hundreds of thousands of controls per page, so you should be fine. You might want to think about your dynamic control token though. If you are planning on using something like Activator.

CreateInstance(...) you will want to have the full type name in your token to make things easier on yourself. – Matt Dearing Feb 28 '10 at 14:56.

I cant really gove you an answer,but what I can give you is a way to a solution, that is you have to find the anglde that you relate to or peaks your interest. A good paper is one that people get drawn into because it reaches them ln some way.As for me WW11 to me, I think of the holocaust and the effect it had on the survivors, their families and those who stood by and did nothing until it was too late.

Related Questions