Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
193 views
in Technique[技术] by (71.8m points)

c# - How to dynamically render asp.net controls from string?

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

<asp:HyperLink ID="IDLink" runat="server" Text="foo" NavigateUrl="/foo.aspx"/>

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

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)
public class Program
    {
        static void Main(string[] args)
        {
            ParserBase parser = new ParserBase();

            Console.WriteLine(parser.DynamicRenderControl<HyperLink>(parser.Parse("")));
            Console.ReadLine();
        }
    }

    public class ParserBase
    {
        public virtual Dictionary<string, string> Parse(string stringToParse)
        {
            //...
            // parse the stringToParse
            //...
            Dictionary<string, string> parsedPropertiesValues = new Dictionary<string, string>();
            parsedPropertiesValues.Add("NavigateUrl", @"http://www.koolzers.net");
            return parsedPropertiesValues;
        }

        protected virtual void SetProperty<T>(T obj, string propertyName, string value) where T : WebControl
        {
            typeof(T).GetProperty(propertyName).SetValue(obj, value, null);
        }


        public string DynamicRenderControl<T>(Dictionary<string, string> parsedPropertiesValues) where T : WebControl, new()
        {
            StringBuilder sb = new StringBuilder();
            using (T control = new T())
            {
                foreach (KeyValuePair<string, string> keyValue in parsedPropertiesValues)
                {
                    SetProperty<T>(control, keyValue.Key, keyValue.Value);
                }

                using (StringWriter tw = new StringWriter(sb))
                {
                    using (HtmlTextWriter w = new HtmlTextWriter(tw))
                    {
                        control.RenderControl(w);
                    }
                }

            }
            return sb.ToString();
        }
    }

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

1.4m articles

1.4m replys

5 comments

57.0k users

...