Как динамически отображать элементы управления asp.net из строки? - PullRequest
3 голосов
/ 28 февраля 2010

Допустим, у меня есть строка, которую я извлекаю из БД, например:
"Lorem Ipsum Dolor Sit Amet, Contetur Sadipscing Elitr, Sed Diam Nonumy Eirmod Tempor invidunt ut labore et {{Hyperlink | navigateurl = '/ foo.aspx'}} Долора Магна Аликвиям."

Эта строка теперь может быть присвоена свойству Text метки.
Я хочу разобрать {{Hyperlink | navigateurl = '/ foo.aspx'}} и заменить его на

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

и присвойте метке весь текст, включая HyperLink-Control.

Это вообще возможно? Я думаю, что я мог бы использовать отражение, чтобы создать элемент управления и установить свойства. (HyperLink-Control был только примером) Но мне удастся вставить элемент управления asp.net обратно в строку, чтобы обеспечить отображение гиперссылок в виде серверного контроля?

Надеюсь, вы понимаете, чего я хочу. Если нет, не стесняйтесь оставлять комментарии.

Редактировать1:

что вы подразумеваете под "назначить целое текст, включая HyperLink-Control на этикетку. "? Вы можете объяснить немного, причина для этого?

Я думаю, что не получится присвоить элемент управления строке, поскольку элемент управления asp.net не может быть помещен в строку.

Подумав, я нашел способ достичь своей цели. Это было бы для создания заполнителя (я называю это A). Там будет добавлен некоторый буквальный контроль. Кроме того, я бы создал заполнитель (я назову его B), добавил свою гиперссылку в B и добавил A в B. Но я думаю, что это способ перебить.

Причиной, по которой я начал думать об этом, было получение доступа к Server.MapPath без замены вхождений в строке. Я хочу иметь возможность использовать относительные пути в моей CMS, которые отображаются как свойство NavigateUrl из гиперссылки. Тем не менее, я думаю, что мой вопрос с динамическим созданием стоит подумать о

Ответы [ 2 ]

4 голосов
/ 28 февраля 2010
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();
        }
    }
1 голос
/ 28 февраля 2010

Я считаю, что это возможно, если вы разделите текст на две метки вместо одной. Я написал быстрый образец для демонстрации. Когда вы анализируете вашу строку из БД, если есть текст до и после вашего динамического элемента управления, чем просто установить свойства BeginText и EndText в DynamicControl.

public class DynamicControl
{
    public String BeginText { get; set; }
    public String EndText { get; set; }
    public String ControlName { get; set; }
    public Dictionary<String, String> 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<String, String> 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<String, String> controlProperties)
    {        
    }

    protected void Page_Load(object sender, EventArgs e)
    {

    }    
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...