Как создать веб-элемент управления ASP.Net 2.0, который может принимать HTML в виде строки (для свойства) между начальным и конечным тегом? - PullRequest
0 голосов
/ 10 августа 2009

В основном я хочу иметь возможность настраивать элемент управления:

public class MyControl : WebControl
{
     private string html;

     public string Html
     { 
         get { return html; }
         set { html = value; }
     }
}

А затем на странице ASPX используйте его так:

<tag:MyControl runat="server">
    <div>
        <span>Some Text</span>
        <button>Do Something</button>
    </div>
</tag:MyControl>

А затем HTML-код, который находится внутри тега: теги start и close MyControl, помещается в свойство HTML элемента управления.

Возможно ли это? Я уверен, что да, у меня просто нет большого опыта с пользовательскими элементами управления ASP.Net.

Ответы [ 4 ]

2 голосов
/ 10 августа 2009

Вы можете создать элемент управления Literal (программно) и добавить его в коллекцию элементов управления пользовательского элемента управления. Затем установите свойство Text литерала из свойства Html:

Создать литерал (например, в OnInit):

_literal = new Literal();
Controls.Add(_literal);

Свойство Html:

public string Html
{ 
     get { return _literal.Text; }
     set { _literal.Text = value; }
}
1 голос
/ 11 августа 2009

Вы могли бы сделать что-то вроде этого

public class TestControl : WebControl
{
    public ITemplate Html { get; set; }
    protected override void Render(HtmlTextWriter writer)
    {
        var stringWriter = new StringWriter();
        var htmlWriter = new HtmlTextWriter(stringWriter);
        var control = new Control();
        Html.InstantiateIn(control);
        control.RenderControl(htmlWriter);

        // now you can use the text as you want
        var htmlString = stringWriter.GetStringBuilder().ToString();

        base.Render(writer); // comment out to not render
    }
}

, а затем на стороне HTML это будет выглядеть так

<app:TestControl runat="server">
    <html>
        <strong>hi there...</strong>
    </html>
</app:TestControl>
1 голос
/ 10 августа 2009

Полагаю, вам захочется взглянуть на шаблонные элементы управления. См. здесь и здесь для примеров.

(я удалю другой ответ, потому что, похоже, я упустил суть).

0 голосов
/ 11 августа 2009

Самый простой способ - просто использовать то, что уже существует:

<asp:Literal runat="server" ID="myHtmlControl">
    <div>
        <span>Some Text</span>
        <button>Do Something</button>
    </div>
</asp:Literal>

Работает как шарм!

Единственное отличие вашего вопроса в том, что содержимое хранится в свойстве с именем Text, а не Html. Вы можете жить с этим?

В противном случае вы можете использовать повторную реализацию Literal следующим образом:

[DefaultProperty("Html")]
[ParseChildren(false)]
public class CustomHtmlControl : WebControl
{
    [PersistenceMode(PersistenceMode.InnerDefaultProperty)]
    [DefaultValue("")]
    public string Html
    { 
        get
        {
            return this.ViewState["Html"] as string ?? "";
        }
        set
        {
            if (this.HasControls())
                this.Controls.Clear();
            this.ViewState["Html"] = value;
        }
    }

    protected override void AddParsedSubObject(object obj)
    {
        if (obj is LiteralControl)
            this.Html = ((LiteralControl) obj).Text;
        else
             throw new NotSupportedException("Cannot add child controls to CustomHtmlControl.");
    }

    protected override void RenderContents(HtmlTextWriter writer)
    {
        writer.Write(this.Html);
    }
}
...