Сведения о вопросе

Faridun

05:01, 14th August, 2020

Теги

c#   .net   asp.net   user-controls   controls    

ASP.NET Пользовательские Элементы Управления-Композиты

Просмотров: 381   Ответов: 6

Резюме

Привет Всем,
OK, далее в мои приключения с пользовательскими элементами управления...

В общем, вот что я узнал о трех основных "classes" пользовательских элементах управления. Пожалуйста, не стесняйтесь поправлять меня, если что-то из этого неправильно!

  1. UserControls -которые наследуются от UserControl и содержатся в файле ASCX . Они довольно ограничены в том, что они могут сделать, но это быстрый и легкий способ получить некоторую общность UI с поддержкой дизайнера.
  2. Пользовательские составные элементы управления -это элементы управления, которые наследуются от WebControl , где вы добавляете ранее существующие элементы управления к элементу управления в методе CreateChildControls. Это обеспечивает большую гибкость, но отсутствие поддержки дизайнера без дополнительного кодирования. Они очень портативны, хотя, поскольку их можно скомпилировать в DLL.
  3. Пользовательские визуализированные элементы управления -подобно пользовательским составным элементам управления, они добавляются в проект Библиотеки веб-элементов управления. Рендеринг элемента управления полностью контролируется программистом путем переопределения метода рендеринга .

свои мысли..

OK, поэтому, играя с пользовательскими композитами, я обнаружил следующее:

  • У вас мало/нет контроля над выходом HTML, что затрудняет "debug".
  • CreateChildControls (и последующие методы) могут быть действительно заняты Controls.Add(myControl) везде.
  • Я обнаружил, что таблицы рендеринга (будь то для макета или контента) значительно неудобны.

Вопрос(ы)..

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

  • Вы используете композиты?
  • Есть ли у вас какие-нибудь аккуратные трюки, чтобы контролировать выход HTML?
  • Вы просто говорите "to hell with it" и идете дальше и создаете пользовательский визуализированный элемент управления?

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

Я с нетерпением жду ваших ответов ^_^



  Сведения об ответе

nYU

13:00, 23rd August, 2020

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

Возможно, есть элементы управления, которые достаточно просты, чтобы заслужить композит (например, a textbox в сочетании с A javascript / dhtml на основе datepicker, например), но за пределами этого примера, похоже, что пользовательские визуализированные элементы управления-это путь.


  Сведения об ответе

SILA

13:56, 10th August, 2020

Вот еще один метод расширения, который я использую для пользовательского рендеринга:

 public static void WriteControls
        (this HtmlTextWriter o, string format, params object[] args)
 { 
    const string delimiter = "<2E01A260-BD39-47d0-8C5E-0DF814FDF9DC>";
    var controls  = new Dictionary<string,Control>();

    for(int i =0; i < args.Length; ++i)
    { 
       var c = args[i] as Control; 
       if (c==null) continue;
       var guid = Guid.NewGuid().ToString();
       controls[guid] = c;
       args[i] = delimiter+guid+delimiter;
    }

    var _strings = string.Format(format, args)
                         .Split(new string[]{delimiter},
                                StringSplitOptions.None);
    foreach(var s in _strings)
    { 
       if (controls.ContainsKey(s)) 
           controls[s].RenderControl(o);
       else 
           o.Write(s);
    }
}

Затем, чтобы отобразить пользовательский композит в методе RenderContents(), я пишу это:

protected override void RenderContents(HtmlTextWriter o)
{ 
    o.WriteControls
         (@"<table>
               <tr>
                    <td>{0}</td>
                    <td>{1}</td>
               </tr>
             </table>"
            ,Text
            ,control1);
 }


  Сведения об ответе

FAriza

00:29, 16th August, 2020

Роб, ты прав. Упомянутый мною подход является своего рода гибридом. Преимущество наличия файлов ascx заключается в том, что в каждом проекте, который я видел, дизайнеры будут чувствовать себя наиболее комфортно при редактировании actual markup, а с ascx вы и дизайнер можете работать отдельно. Если вы не планируете вносить фактические изменения CSS/markup/design в сами элементы управления позже, вы можете перейти к настраиваемому визуализированному элементу управления. Как я уже сказал, мой подход уместен только для более сложных сценариев (и это, вероятно, там, где вам нужен дизайнер :))


  Сведения об ответе

fo_I_K

00:45, 28th August, 2020

Я часто использую составные элементы управления. Вместо того, чтобы переопределить render или RenderContents, CssClass просто назначить каждому контролировать и использовать стили. Для нескольких Controls.Add я использую метод расширения:

//Controls.Add(c1, c2, c3)
static void Add(this ControlCollection coll, params Control[] controls)
 { foreach(Control control in controls) coll.Add(control);
 }

Для быстрого и грязного рендеринга я использую что-то вроде этого:

writer.Render(@"<table>
                   <tr><td>{0}</td></tr>
                   <tr>
                       <td>", Text);
control1.RenderControl(writer);
writer.Render("</td></tr></table>");

Для инициализации свойств элемента управления я использую синтаксис инициализатора свойств:

childControl = new Control {  ID="Foo"
                            , CssClass="class1"
                            , CausesValidation=true;
                           };


  Сведения об ответе

DO__IT

07:39, 8th August, 2020

Использование пользовательских составных элементов управления имеет смысл в ситуации, когда у вас есть большое веб-приложение и вы хотите повторно использовать большие куски во многих местах. Тогда вы только добавите дочерние элементы управления из тех, которые вы разрабатываете, а не повторяете сами. Недавно я работал над большим проектом и вот что мы сделали:

  • Каждый составной элемент управления имеет контейнер. Используется в качестве обертки для всего, что находится внутри элемента управления.
  • Каждый составной элемент управления имеет шаблон. Файл ascx (без директивы <%Control%>), который содержит только markup для шаблона.
  • Контейнер (сам по себе являющийся элементом управления) инициализируется из шаблона.
  • Контейнер предоставляет свойства для всех других элементов управления в шаблоне.
  • Вы используете только this.Controls.Add([the_container]) в составном элементе управления.

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


  Сведения об ответе

davran

19:02, 18th August, 2020

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

http://aspadvice.com/blogs/ssmith/archive/2007/10/19/Render-User-Control-as-String-Template.aspx

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

Это избавит вас от необходимости создавать экземпляры всего дерева элементов управления и стилизовать элемент управления в C#!


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться