Как добиться встроенных пользовательских тегов в asp.net? - PullRequest
0 голосов
/ 23 сентября 2011

Я нашел этот пример:

<telerik:RadDatePicker
 ID="RadDatePicker1"
 runat="server">
 <DateInput Width="100%"></DateInput>
 <Calendar
     CellAlign="Center"
     CellVAlign="Middle"
     DayNameFormat="FirstLetter"
     FirstDayOfWeek="Default"
     MonthLayout="Layout_7columns_x_6rows"
     Orientation="RenderInRows"
     TitleAlign="Center"
     UseColumnHeadersAsSelectors="False"
     ShowRowHeaders="False">
</Calendar>
<DatePopupButton 
     CssClass="radPopupImage_Default" 
     BorderColor="#D0E1F2" 
     BorderStyle="Solid" 
     BorderWidth="1px" />

Я предполагаю, что внутри RadDatePicker есть объект DateInput, объект Calendar и объект DatePopupButton.

Я быхотел бы иметь свой собственный пользовательский элемент управления, который разрешает доступ к внутреннему объекту, например

    <jonno:textbox id="txt1" runat="server"><FieldConfig fieldName="Input1"/></jonno:textbox>

В идеале я не хочу, чтобы класс FieldConfig был визуальным классом, но это нормально, если он есть.

Как мне этого добиться?

1 Ответ

2 голосов
/ 23 сентября 2011

Встроенные пользовательские теги - это свойства вашего элемента управления.Чтобы включить их настройку в разметке, вам необходимо украсить свой элемент управления и свойства следующими атрибутами:

  • Элемент управления: ParseChilden, PersistChildren
  • Свойства: PersistenceMode

Пример из элемента управления, который я использую, который делает нечто подобное:

/// <summary>
/// Control that will conditionally show one of two views
/// </summary>
[ParseChildren(true)]
[PersistChildren(true)]
public class EditingView : CompositeControl
{
    #region private fields

    private View _displayView = new View();
    private View _editView = new View();

    #endregion
    #region properties

    /// <summary>
    /// The view that will be rendered in display mode
    /// </summary>
    [PersistenceMode(PersistenceMode.InnerProperty)]
    public View DisplayView
    {
        get
        {
            return _displayView;
        }
        set
        {
            _displayView = value;
        }
    }

    /// <summary>
    /// The view that will be rendered in editing mode
    /// </summary>
    [PersistenceMode(PersistenceMode.InnerProperty)]
    public View EditView
    {
        get
        {
            return _editView;
        }
        set
        {
            _editView = value;
        }
    }
    /* Implementation details hidden */
}

Просмотрите атрибуты в msdn, чтобы узнать, что именно они делают.Выше следует сделать то, что вам нужно сделать, хотя.Затем в разметке я могу просто назначить два вида:

<ctl:EditingView runat="server">
<DisplayView>
    blah blah
</DisplayView>
<EditView>
    blah blah edit
</EditView>
</ctl:EditingView>

Единственное отличие состоит в том, что мои свойства все еще являются WebControls и принимают больше дочерних элементов управления.Это не должно иметь значения, если вы правильно установите свои атрибуты.

Менно

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