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

Позвольте мне быть общий [тогда конкретный]:

  1. Ваш предпочтительный IDE [ VS 2008 здесь]
  2. Ваш отладчик [Это обычно - часть Вашего IDE, но иногда WinDbg необходим]
  3. Его плагины для рефакторинга и управления исходным кодом [ Resharper 4 + и анк SVN 2 + ]
  4. дополнения Вашей ОС для управления исходным кодом [ черепаха SVN ]
  5. А лучший Инструмент Разности и Слияния для включения вышеупомянутых инструментов SCM [ WinMerge]
  6. А, быстро загружающий текстовый редактор для того, когда IDE является слишком много [ энергией , Блокнот ++ ]
  7. , Если Вы делаете веб-разработку, получаете инструменты для того [ Firefox 3 с Дополнениями: Веб-разработчик , Firebug, TamperData, Плакат , Firecookie, FireFTP, FirePHP, Радуга для Firebug, ReloadEvery, селен IDE ]
  8. инструменты Requisite для работы с текстом [ GNU TextUtils, через [1 120] cygwin или gnuwin32.sf.net ]
  9. инструменты Сценариев [ Perl, Python , zsh , весь те GNU основывает пакеты в cygwin]
  10. инструмент тестирования Регулярного выражения А для того, когда Ваш глазной вред [ Экспресс , RegexBuddy]

Для Java, который я выгружаю 1 и 3 с [1 128] Eclipse и его плагины для [1 129] Знаток и SVN, я не нашел, что рефакторинг включает..., Вы думали бы, что я буду использовать ИДЕЯ IntelliJ , но я никогда не начинал использовать его.

5
задан Thierry 20 November 2009 в 06:21
поделиться

2 ответа

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

public interface IEditor
{
    bool CanHandle(EntityBase entity);
    void Display(EntityBase entity);
    void Save(EntityBase entity);
}

public partial class AddressEditor : UserControl, IEditor
{
    public bool CanHandle(EntityBase entity)
    { 
        return (entity is Address);
    }

    public void Display(EntityBase entity)
    {
        var address = (Address)entity;
        addressLine1Textbox.Text = address.Line1;
        // etc...
    }

    public void Save(EntityBase entity)
    {
        var address = (Address)entity;
        address.Line1 = addressLine1Textbox.Text;
        // etc...
    }
}

Затем, используя контейнер IoC (в данном случае - StructureMap), я могу получить правильный пользовательский элемент управления с чем-то вроде

var editorControl = ObjectFactory.GetAllInstancesOf<IEditor>().First(x => x.CanHandle(myEntity));

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

public string AscxFile { get { return "~/UserControls/AddressEditor.ascx"; } } // Implements IEditor.AscxFile

Затем на вызывающей странице используйте LoadControl:

var actualControl = LoadControl(editorControl.AscxFile);
editorPlaceholder.Controls.Add(actualControl);
editorControl.Display(myEntity);

Я предпочел использовать Composite Controls, они требуют немного больше усилий для создания, но не о чем беспокоиться файл .ascx, я могу просто добавить его прямо на страницу:

4
ответ дан 14 December 2019 в 19:17
поделиться

Мы создали набор приложений, используя аналогичную модель.
У нас есть так называемый PageBuilder, который создает каждую страницу путем внедрения UserControls и WebParts.

Все настраивается (макет страницы, элементы управления страницей, положение элемента управления и т. Д.), Поэтому нет необходимости изменять какой-либо код на страницах, элементах управления UserControls или WebParts. (Если не нужно добавлять / изменять некоторые функции).

У нас даже есть конфигурация и настройки в элементах управления для изменения поведения в зависимости от различных вещей, таких как запросы SQL, режим, текущая страница и т. Д.

В основном это работает следующим образом:

  • Создает макетную таблицу для текущей страницы.
  • Получите отображение элементов управления пользователя и веб-частей.
  • Поместите каждый элемент управления пользователя и веб-часть в правильное положение.
  • Примените настройки к каждому элементу управления пользователем и веб-части.

Все веб-части могут связываться друг с другом с помощью настраиваемого издателя / модель событий подписчика. Т.е. В веб-части A раскрывающийся список изменен => веб-часть B показывает данные для выбранного элемента.

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

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

Edit:
В основном наша структура состоит из нескольких главных страниц и базовых страниц, которые вызывают PageBuilder.
с ним легко работать. И с точки зрения разработчиков, и с точки зрения клиентов.

Edit:
В основном наша структура состоит из нескольких главных страниц и базовых страниц, которые вызывают PageBuilder.
с ним легко работать. И с точки зрения разработчиков, и с точки зрения клиентов.

Edit:
В основном наша структура состоит из нескольких главных страниц и базовых страниц, которые вызывают PageBuilder.
Каждая главная страница используется для разных типов объектов: страниц, элементов управления, веб-части, лайтбоксов и т. Д.
Каждая страница aspx содержит PlaceHolder для UserControls и WebParts. Этот PlaceHolder заполняется PageBuilder.

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

У нас есть более 100 UserControls и WebParts для различных aspx-страниц, но большинство aspx-страниц выглядят примерно так:

<%@ Page MasterPageFile="main.master" ... %>
<asp:Content runat="server" ContentPlaceHolderID="Main" ID="MainSection">
  <asp:PlaceHolder runat="server ID="UserControlPlaceHolder"></asp:PlaceHolder>
</asp:Content>

в заднем коде у нас есть что-то вроде:

Partial Class MyPageClass Inherits BasePage
  Protected Sub Page_Init(ByVal sender As Object, ByVal e as System.EventArgs) Handles Me.Init
    'The following method is in the BasePage and is part of the PageBuilder.
    LoadControls()
  End Sub
End Class

PageBuilder создает макет, затем загружает и добавляет все элементы управления и веб-части в нужное место.
(макет, элементы управления и положение элементов управления выбираются из конфигурации.)

Затем PageBuilder применяет настройки для каждого элемента управления и веб-части. Эти параметры также можно изменить. Настройки могут быть такими простыми, как высота элемента управления, или более сложными вещами, такими как «режим отображения» (статический, зависит от страницы, зависит от группы и т. Д.).

Надеюсь, это объясняет это более подробно.

1
ответ дан 14 December 2019 в 19:17
поделиться
Другие вопросы по тегам:

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