Как динамически отображать элементы управления asp.net из строки?

Допустим, у меня есть строка, которую я извлекаю из БД, например:
"Lorem ipsum dolor sit amet, constetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et {{Hyperlink | navigateurl = '/ foo. aspx '}} dolore magna aliquyam ".

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

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

и назначьте метке весь текст, включая HyperLink-Control.

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

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

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

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

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

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

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


person citronas    schedule 28.02.2010    source источник
comment
что вы имеете в виду под "assign the whole text including the HyperLink-Control to the Label."? не могли бы вы объяснить причину этого?   -  person Asad    schedule 28.02.2010


Ответы (2)


Я считаю, что это возможно, если вы разделите текст на две метки вместо одной. Я написал небольшой образец для демонстрации. Когда вы анализируете свою строку из базы данных, если есть текст до и после вашего динамического элемента управления, просто установите свойства 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)
    {

    }    
}
person Matt Dearing    schedule 28.02.2010
comment
Ага, что-то подобное пришло мне в голову. Как вы думаете, насколько это будет эффективно? - person citronas; 28.02.2010
comment
Отражение определенно медленнее, чем прямой доступ к некоторому объекту, но я думаю, что это сообщение в блоге суммирует множество распространенных заблуждений west-wind.com/weblog/posts/351.aspx. Я предполагаю, что вы не собираетесь автоматически генерировать сотни тысяч элементов управления на странице, так что все будет в порядке. Возможно, вы захотите подумать о своем токене динамического управления. Если вы планируете использовать что-то вроде Activator.CreateInstance (...), вам нужно иметь полное имя типа в своем токене, чтобы упростить себе жизнь. - person Matt Dearing; 28.02.2010

person    schedule
comment
Хороший. Даже не отображая субэлемент управления и не добавляя вывод html обратно в строку. - person citronas; 28.02.2010
comment
Вот что я искал! :) - person Dawid Rutkowski; 22.01.2015