Пользовательские элементы управления ASP.NET - составляют композит

Проверьте, не были ли эти файлы удалены из корзины / корзины, поскольку API списка также возвращает удаленные файлы, которые не были удалены из корзины.

19
задан Rob Cooper 20 August 2008 в 07:49
поделиться

6 ответов

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

Там, возможно, средства управления, которые достаточно просты заслужить составной объект (например, текстовое поле, объединенное с javascript/dhtml базирующийся datepicker, например), но кроме того один пример, он похож, пользовательские представленные средства управления являются способом пойти.

5
ответ дан 30 November 2019 в 05:13
поделиться

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

 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);
 }
3
ответ дан 30 November 2019 в 05:13
поделиться

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

2
ответ дан 30 November 2019 в 05:13
поделиться

Я часто использую составные элементы управления. Вместо того, чтобы переопределить Рендеринг или RenderContents, просто присвойте каждому Управлению CssClass и используйте таблицы стилей. Для нескольких Средств управления. Добавьте, я использую дополнительный метод:

//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;
                           };
1
ответ дан 30 November 2019 в 05:13
поделиться

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

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

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

1
ответ дан 30 November 2019 в 05:13
поделиться

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

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

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

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

0
ответ дан 30 November 2019 в 05:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: