Переопределение свойства Controls в пользовательском элементе управления - плохая идея? - PullRequest
0 голосов
/ 08 января 2010

Я пытаюсь создать пользовательский элемент управления веб-частью. Я собираюсь использовать Mono, так что нет, я не могу просто использовать ASP.Net (это то, что мы использовали до того, как решили перейти в Mono).

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

В классе WebPart я хочу, чтобы он просто содержал заголовок и контент (оба были способны применять таблицы стилей).

Прямо сейчас у меня в конструкторе WebPart просто есть метка и панель, добавляемые в расположение 0 элементов управления, чтобы заголовок отображался (с меткой, помещаемой на панель). Теперь вот моя проблема. Нет простого способа содержания контента WebPart (который будет просто разметкой и тому подобным для производного элемента управления), чтобы я мог применить класс стилей отдельно только к содержимому и только к заголовку производного элемента управления.

Единственное решение, которое я вижу, это сделать что-то вроде Panel для заголовка и содержимого, а затем переопределить WebPart.Controls, чтобы Controls=pnlContent.Controls.

Каковы последствия этого? Будет ли это портить уникальные идентификаторы или JavaScript? Есть ли лучший способ обойти это? Это нормально для пользовательского элемента управления?

Какие проблемы могут возникнуть при переопределении индексатора Control пользовательского элемента управления для указания на свойство Control другого элемента управления?

Мой предложенный класс будет примерно таким (очень упрощенным)

abstract class WebPart{
  protected lblTitle=new Label();
  protected pnlContent=new Panel();
  public ControlCollection Controls{
    get{
      return pnlContent.Controls;
    }
  }
  public WebPart(){
    base.Controls.Add(lblTitle);
    base.Controls.Add(pnlContent);
  }
}

Кроме того, могут ли ASP.Net иметь проблемы при рендеринге, потому что я скрываю свойство base.Controls? (таким образом, это только представило бы pnlContent.Controls, а не this.Controls?)

Ответы [ 3 ]

1 голос
/ 11 января 2010

Это на самом деле не отвечает на вопрос ... но мы просто переопределили RenderControl для рендеринга некоторых дополнительных вещей вместо попытки переопределить метод Controls. Кажется, что переопределение Controls работает, пока вы не доберетесь до событий onchange и viewstate, хотя ..

0 голосов
/ 08 января 2010

Исходя из вашего комментария, разве вы не можете просто написать что-то вроде этого (я не знаю Mono, поэтому просто игнорируйте это, если это полная чушь - в ASP.net я бы написал так же) * *

public class MyCustomServerControl : CompositeControl
{
   private Label labelTitle;
   private Panel panelContent;

   public override CreateChildControls()
   {
      base.Controls.Clear();

      labelTitle = new Label();
      labelTitle.ID = "lblTitle";

      panelContent = new Panel();
      panelContent.ID = "pnlContent";


      this.Controls.Add(labelTitle);
      this.Controls.Add(panelContent);
   }

   [Browsable(true)]
   public string LabelCssClass
   {
      get 
      {
         EnsureChildControls();
         return labelTitle.CssClass; 
      }
      set 
      { 
         EnsureChildControls();
         labelTitle.CssClass = value; 
      }
   }

   [Browsable(true)]
   public string PanelContentCssClass
   {
      get 
      {
         EnsureChildControls();
         return panelContent.CssClass; 
      }
      set 
      { 
         EnsureChildControls();
         panelContent.CssClass = value; 
      }
   }
   ... 
}

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

Я не знаю, чего именно вы хотите достичь, но вы должны взглянуть на класс ITemplate .

На ваш вопрос о переопределении коллекции Controls: когда я создаю пользовательские серверные элементы управления, я склонен менять их как можно меньше. Серверные элементы управления должны работать во многих различных ситуациях, вложенных в пользовательские элементы управления, возможно, в другие шаблонные элементы управления и т. Д. Это может быстро привести к странным побочным эффектам, которые затем чрезвычайно трудно отследить. Я создал группу элементов управления уже во время стандартизации разработки нашего пользовательского интерфейса, и мне никогда не приходилось переопределять базовые свойства WebControl или даже Control. Композиция работает в большинстве случаев довольно хорошо.

0 голосов
/ 08 января 2010

Я думаю, что самая большая проблема будет с высвобождением ресурсов. Из MSDN:

Control.Dispose

Освобождает неуправляемые ресурсы, использованные Контролем и его дочерними элементами управления и опционально выпускает управляемый ресурсы.

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

...