Я хочу разрешить дочерний контент в моем UserControl - PullRequest
0 голосов
/ 09 октября 2018

Я создал UserControl с именем «AlertBox», который имеет свойство «AlertText». Я могу использовать его так:

<uc1:AlertBox ID="AlertBox1" runat="server" AlertText="This is an alert" />

Однако я хотел бы иметь возможность добавлять HTML или другие элементы управленияв качестве дочерних элементов управления, таких как:

<uc1:AlertBox ID="AlertBox1" runat="server">
    <p>Please click the button below to continue.</p>
    <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Continue" />
</uc1:AlertBox>

Я хочу, чтобы это было по существу так, как работает элемент управления Label, где вы можете либо присвоить значение его свойству Text, либо добавить дочернее содержимое.Я посмотрел исходный код .NET для элемента управления Label (https://referencesource.microsoft.com/#System.Web/UI/WebControls/Label.cs,508f83e965a6ff4b) и вижу следующую реализацию свойства Text:

[
    Localizable(true),
    Bindable(true),
    WebCategory("Appearance"),
    DefaultValue(""),
    WebSysDescription(SR.Label_Text),
    PersistenceMode(PersistenceMode.InnerDefaultProperty)
]
public virtual string Text {
    get {
        object o = ViewState["Text"];
        return((o == null) ? String.Empty : (string)o);
    }
    set {
        if (HasControls()) {
            Controls.Clear();
        }
        ViewState["Text"] = value;
    }
}

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

<uc1:AlertBox ID="AlertBox1" runat="server">
    This is an alert
</uc1:AlertBox>

[DefaultValue(""), PersistenceMode(PersistenceMode.InnerDefaultProperty)]
public string AlertText
{
    get
    {
        if (ViewState[nameof(AlertText)] == null)
            ViewState[nameof(AlertText)]= "";

        return (string)ViewState[nameof(AlertText)];
    }

    set
    {
        if (HasControls())
            Controls.Clear();

        ViewState[nameof(AlertText)] = value;
    }
}

, я получаю следующую ошибку:

Server Error in '/' Application.
Parser Error
Description: An error occurred during the parsing of a resource required to service this request. Please review the following specific parse error details and modify your source file appropriately. 

Parser Error Message: Literal content ('This is an alert') is not allowed within a 'ASP.controls_alertbox_ascx'.

Source Error: 

Line 15: 
Line 16:    <uc1:AlertBox ID="AlertBox1" runat="server">
Line 17:        This is an alert
Line 18:    </uc1:AlertBox>
Line 19: 

Source File: /Members/Home.aspx    Line: 17 

Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.7.3160.0

Это то, что я 'я пытаюсь сделать это даже с помощью WebControl (.ascx) или мне нужно вместо этого реализовать это как UserControl? Я тоже не хочу делать это шаблонным элементом управления.

...