ASP.NET: предоставление элементов управления пользовательского веб-элемента - PullRequest
4 голосов
/ 14 апреля 2009

Я создал несколько веб-элементов управления (файлы .ascx) и поместил их в Pages. Пользовательские элементы управления содержат некоторые текстовые поля, к которым я бы хотел, чтобы страница имела прямой доступ.

Какой самый простой (читай: наименьшее время) способ предоставления этих текстовых полей в пользовательских элементах управления на страницы, содержащие пользовательские элементы управления?

Две известные мне опции - это вызов myUserControl.FindControl (id) со страниц (работает ли это даже со страницы?) И запись свойств в пользовательские элементы управления для представления значений TextBox.

Ни один из них не кажется идеальным. FindControl () требует, чтобы Page знала идентификаторы TextBoxes в пользовательских элементах управления, тем самым нарушая инкапсуляцию и добавляя жестко запрограммированные строки, а написание набора свойств в пользовательских элементах управления будет занимать очень много времени, учитывая количество TextBoxes у этих пользователей контроля.

Нет способа объявить эти текстовые поля в моих пользовательских элементах управления открытыми вместо защищенных ?

Ответы [ 5 ]

4 голосов
/ 14 апреля 2009

(Оставляя в стороне очевидные комментарии о том, что то, что вы описываете, по сути является противоположностью лучшей практики ...)

Если вы используете проект типа веб-приложения, у вас должен быть файл designer.cs для каждого элемента UserControl. Он содержит объявление каждого дочернего элемента управления, поэтому вы можете изменить модификатор доступа на public.

Если вы используете проект типа веб-сайта, вам, вероятно, следует преобразовать его в веб-приложение. Согласно Microsoft (и подтвержденной опытом), тип веб-сайта не предназначен для использования, когда вы планируете писать обширный код, который выходит за рамки одного кода.

2 голосов
/ 14 апреля 2009

Если мне придется сделать это, я напишу публичное свойство, которое предоставляет элементы управления. Однако обычно есть способ переписать информацию так, чтобы вам не нужно было выставлять внутренний контроль. Если все, что вам нужно, это значение, создайте свойство, которое возвращает значение. Если вам нужны идентификаторы клиента, возможно, создание клиентского объекта, предоставляющего значения или события, решит проблему. Помните, что как только вы сделаете это публичным, вы выставите контракт, и изменение этого контракта почти всегда будет болезненным.

1 голос
/ 07 октября 2009

Вы можете выставить его как свойство из кода ниже. Вы действительно сможете получить доступ к его свойствам только из кода, но не из дизайнера ASP.Net. Это пример в vb, который предоставляет DropDownList для пользовательского элемента управления (и, возможно, это не лучшая практика, но он, безусловно, превосходит написание кода для предоставления всех свойств дочерних элементов управления):

''' <summary>
''' This is the exposed DropDownList for this control.
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks></remarks>
Public ReadOnly Property DrowDownList() As DropDownList
    Get
        Return ddControlList
    End Get
End Property
0 голосов
/ 14 апреля 2009

Извлеките все ваши пользовательские веб-элементы управления из общего базового класса и представьте эту функцию как открытый метод (или методы). Ваш базовый класс может быть производным от UserControl (как обычно .ascx), а ваши элементы управления, в свою очередь, - от него.

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

Итак, если вам нужно просто получить значение текстового поля по идентификатору от родителя, вы можете добавить что-то вроде следующего в ваш базовый класс:

    public string GetTextboxValue(string id)
    {
        string textValue = string.Empty;
        Control ctl = FindControl(id);
        if (ctl.GetType() == typeof(TextBox))
            textValue = ((TextBox)ctl).Text;
        return textValue;
    }

Я бы сказал пойти по этому пути против предыдущего предложения сделать TextBox общедоступным, поскольку вы действительно хотите только читать текстовое значение из родительского элемента, а не выставлять весь объект как доступ для чтения / записи.

0 голосов
/ 14 апреля 2009

Почему бы не предоставить своему пользовательскому элементу управления коллекцию TextBoxes, представить коллекцию как свойство, а в методе Init () просто добавить все свои текстовые поля в коллекцию?

Таким образом, у вас есть коллекция, которую вы можете искать по идентификатору, если вам когда-либо понадобится, не полагаясь на логику страницы, и вам нужно только предоставить одно свойство. Если вы создадите для него собственный класс коллекции, вы даже можете запрограммировать несколько удобных методов для доступа к текстовым полям так, как вам нужно.

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