Шаблоны проектирования — образцы шаблонов MVC для начинающих

Опубликовано: 2016-04-15

В нем объясняется, что такое шаблон MVC и что такое ASP.NET MVC Framework, как он работает. Также объясняет жизненный цикл страницы ASP.NET MVC и функции ASP.NET MVC в зависимости от версии.

В примерах представлены пошаговые инструкции, которые помогут новичкам легко понять и освоить ASP.NET MVC.

Поскольку все мы знаем множество шаблонов проектирования и используем их при реализации бизнес-компонентов и сервисов в наших приложениях, мы все равно будем сталкиваться с проблемами/проблемами с нашими приложениями. Также изо дня в день потребности бизнеса и приоритеты будут меняться. Если мы внимательно посмотрим на ряд проблем, дефектов и проблем, с которыми мы сталкиваемся, это уровни пользовательского интерфейса и представления. Хотя некоторые дефекты связаны с бизнес-логикой и бизнес-правилами, нам может потребоваться исправить их на уровнях пользовательского интерфейса и представления, поскольку мы можем тесно интегрировать бизнес-логику в уровни пользовательского интерфейса и представления. Причина этого в том, что мы не сосредоточились на реализации правильного шаблона проектирования в наших приложениях. Давайте пройдем шаг за шагом и поймем, как реализовать и использовать шаблон представления в наших приложениях.

Постановка задачи:
  1. Уже используются разные шаблоны в приложении, но по-прежнему сложно поддерживать приложение.
  2. Использование VS Test, NUnit, MBUnit и т. Д. Для тестирования уровня бизнес-логики, но в приложении все еще существуют некоторые дефекты, поскольку бизнес-логика задействована на уровне представления.
  3. Используемый уровень представления, уровень бизнес-логики, уровень доступа к данным в приложении, но иногда все еще необходимо писать избыточный код на уровне представления для использования или вызова других модулей или других вариантов использования.
  4. Дефекты интеграции появляются, когда мы вносим некоторые изменения в интегрированные модули.
  5. Исправление дефектов и усовершенствования требуют больше времени для анализа логики уровня представления и ее интеграционных зависимостей, что приводит к открытию новых дефектов.
  6. ASP.NET MVC нельзя выбрать, поскольку пользовательский интерфейс сложен для создания.
Основная причина проблемы:

В слое представления

  1. Страница или форма содержит элементы управления, отображающие данные домена приложения. Пользователь может изменять данные и отправлять изменения. Страница извлекает данные домена, обрабатывает пользовательские события, изменяет другие элементы управления на странице в ответ на события и отправляет измененные данные домена. Включение кода, выполняющего эти функции, в веб-страницу Кроме того, трудно совместно использовать код между веб-страницами, требующими одинакового поведения. сложный класс, его трудно поддерживать и трудно тестировать.
  2. Уровень пользовательского интерфейса, логика пользовательского интерфейса, логика представления, бизнес-логика тесно связаны между собой.
  3. Уровень представления отвечает за интеграцию модулей или вариантов использования.
Решение:
  1. Выберите лучший шаблон уровня представления, чтобы разделить уровень пользовательского интерфейса, логику пользовательского интерфейса и логику представления, а также бизнес-логику как отдельные слои, чтобы упростить понимание и поддержку кода.
  2. Включите слабую связь при разработке модулей или любых вариантов использования.
  3. Максимизируйте код, который можно протестировать с помощью автоматизации. (Представления трудно проверить.)
  4. Делитесь кодом между страницами, требующими одинакового поведения.
  5. Разделите обязанности по визуальному отображению и поведению обработки событий на разные классы с именами, соответственно, представления и презентатора, или контроллера, или ViewModel.
Преимущества использования шаблона презентации:
  1. Модульность
  2. Подход, основанный на тестировании — максимизируйте код, который можно протестировать с помощью автоматизации.
  3. Разделение интересов
  4. Совместное использование кода между страницами и формами
  5. Простота обслуживания

Какие шаблоны уровня представления доступны?

MVC (контроллер представления модели)

MVP (презентатор представления модели) или (пассивное представление модели, контроллер супервизора)

MVVM (представление модели ViewModel)

MVC против MVP против MVVM:
  1. Модель и представление представляют одно и то же во всех трех вышеперечисленных шаблонах?

    да

  2. Цель Controller, Presenter и ViewModel одинакова во всех трех вышеперечисленных шаблонах?

    да

  3. Связь и поток моделей, представлений с контроллером, презентаторов и ViewModel одинаковы?

    Нет , именно поэтому существуют эти 3 шаблона.

  4. Являются ли эти шаблоны заменой PL (уровень представления), BLL (уровень бизнес-логики) и DAL (уровень доступа к данным)

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

Выберите лучший шаблон слоя презентации:

Лучший игрок

  1. Привязка через контекст данных невозможна
  2. Сложный дизайн пользовательского интерфейса
  3. Лучше всего подходит для Windows Forms, ASP.NET Web Forms и приложений Sharepoint

МВК

  1. Лучше всего для ASP.NET с простым пользовательским интерфейсом
  2. Отключенная модель (просмотр отделен от всех других слоев)

Примечание. Здесь я не сосредотачиваюсь на MVC VM (MVC ViewModel из MVC3) и ASP.NET MVVM с внедрением зависимостей.

МВВМ

  1. Возможна привязка через datacontext
  2. Подключенная модель
  3. Лучше всего подходит для приложений WPF и Silverlight
Веб-формы ASP.NET против ASP.NET MVC:

Веб-формы ASP.NET

  1. РАД
  2. Более легкая разработка
  3. Богатая экосистема управления
  4. Знакомый подход к разработке для Windows Forms
  5. Нет поддержки ViewState и обратной передачи

ASP.NET MVC

  1. Чистое разделение ответственности (SoC)
  2. Полный контроль разметки
  3. Включить TDD (разработка через тестирование)
  4. Включить и легко сделать REST
  5. Более простая интеграция на стороне клиента (Javascript)
  6. Multi View Engine (это действительно круто!)
  7. Нет поддержки ViewState и обратной передачи
  8. Расширяемость и поддержка WEB 2.0

Модель, представления и контроллер

  • Модель . Объекты модели — это части приложения, которые реализуют логику предметной области приложения. Часто объекты модели извлекают и сохраняют состояние модели в базе данных. Например, объект Product может извлекать информацию из базы данных, работать с ней, а затем записывать обновленную информацию обратно в таблицу Products в SQL Server.
  • Представления . Представления — это компоненты, которые отображают пользовательский интерфейс приложения (UI). Обычно этот пользовательский интерфейс создается из данных модели. Примером может служить представление редактирования таблицы «Продукты», в котором отображаются текстовые поля, раскрывающиеся списки и флажки в зависимости от текущего состояния объекта «Продукты».
  • Контроллер . Контроллеры — это компоненты, которые обрабатывают взаимодействие с пользователем, работают с моделью и, в конечном итоге, выбирают представление для визуализации, отображающее пользовательский интерфейс. В приложении MVC представление отображает только информацию; контроллер обрабатывает и реагирует на ввод и взаимодействие пользователя. Например, контроллер обрабатывает значения строки запроса и передает эти значения модели, которая, в свою очередь, запрашивает базу данных, используя значения.
Жизненный цикл страницы высокого уровня ASP.NET MVC?

ASP.NET MVC High Level Page Life Cycle

Жизненный цикл низкоуровневой страницы ASP.NET MVC?

ASP.NET MVC Low Level Page Life Cycle

Новые возможности MVC2.0

1. Шаблонные помощники:

Шаблонные помощники помогают нам автоматически связывать HTML-элементы для редактирования и отображения с типами данных.

Например, когда данные типа System.DateTime отображаются в представлении, элемент пользовательского интерфейса средства выбора даты может отображаться автоматически.

Это похоже на то, как шаблоны полей работают в динамических данных ASP.NET.

2. Области:

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

Каждый раздел («область») обычно представляет собой отдельный раздел большого веб-сайта и используется для группировки связанных наборов контроллеров и представлений.

Например

[xhtml]
Области
Администратор
Контроллеры
Модели
Просмотры
Претензии Иниала
Контроллеры
Модели
Просмотры
[/xhtml]

3. Поддержка асинхронных контроллеров:

ASP.NET MVC2 позволяет контроллерам обрабатывать запросы асинхронно.

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

4. Поддержка DefaultValueAttribute в параметрах метода действия:

Класс System.ComponentModel.DefaultValueAttribute позволяет указать значение по умолчанию для параметра аргумента метода действия.

Например, предположим, что определен следующий маршрут по умолчанию:

[код]
{контроллер}/{действие}/{идентификатор}
[/код]

Также предположим, что определены следующие контроллер и метод действия:

[код]
открытый класс ArticleController
{
общественное представление ActionResult (int id, [DefaultValue (1)] int страница)
{
}
}
[/код]

Любой из следующих URL-адресов запроса вызовет метод действия View, определенный в предыдущем примере.

  • /Статья/Просмотреть/123
  • /Article/View/123?page=1 (фактически то же самое, что и предыдущий запрос)
  • /Статья/Просмотр/123?page=2
5. Поддержка привязки двоичных данных с помощью связывателей моделей:

Есть две новые перегрузки помощника Html.Hidden , которые кодируют двоичные значения как строки в кодировке base-64:

[код]
общедоступная статическая строка Скрытая (это HtmlHelper htmlHelper, имя строки, двоичное значение);
общедоступная статическая строка Скрытая (это HtmlHelper htmlHelper, имя строки, значение байта []);
[/код]

6. Поддержка атрибутов DataAnnotations :

Использование атрибутов проверки RangeAttribute , RequiredAttribute , StringLengthAttribute и RegexAttribute (определенных в пространстве имен System.ComponentModel.DataAnnotations ) при привязке к модели для обеспечения проверки ввода.

[код]
использование System.ComponentModel.DataAnnotations;
пространство имен MvcTmpHlprs
{
[Тип метаданных (тип (ProductMD))]
общедоступный частичный класс Product
{
открытый класс ProductMD
{
открытый объект SellStartDate { получить; задавать; }
[UIHint("rbDate")]
открытый объект SellEndDate { получить; задавать; }
[ТипДанных(ТипДанных.Дата)]
общественный объект DiscontinuedDate { получить; задавать; }
[ScaffoldColumn(false)]
открытый объект ModifiedDate { получить; задавать; }
[ScaffoldColumn(false)]
общедоступный объект rowguid { получить; задавать; }
[ScaffoldColumn(false)]
общественный объект ThumbnailPhotoFileName { получить; задавать; }
}
}
}
[/код]

7. Поставщики модели-валидатора:

Класс поставщика проверки модели представляет собой абстракцию, обеспечивающую логику проверки модели.

ASP.NET MVC включает поставщика по умолчанию на основе атрибутов проверки, включенных в пространство имен System.ComponentModel.DataAnnotations .

8. Проверка на стороне клиента:

Класс поставщика средства проверки модели предоставляет браузеру метаданные проверки в виде сериализованных данных JSON, которые могут использоваться библиотекой проверки на стороне клиента.

ASP.NET MVC 2 включает библиотеку проверки клиента и адаптер, который поддерживает атрибуты проверки пространства имен DataAnnotations , упомянутые ранее.

9. Новый фильтр действия RequireHttpsAttribute :

ASP.NET MVC 2 включает новый класс RequireHttpsAttribute , который можно применять к методам действий и контроллерам.

По умолчанию фильтр перенаправляет запрос без SSL (HTTP) на эквивалент с поддержкой SSL (HTTPS).

10. Переопределение глагола метода HTTP:

Когда мы создаем веб-сайт с использованием архитектурного стиля REST, HTTP-глаголы используются для определения того, какое действие необходимо выполнить для ресурса.

REST требует, чтобы приложения поддерживали весь диапазон общих HTTP-команд, включая GET , PUT , POST и DELETE .

ASP.NET MVC 2 включает новые атрибуты, которые мы можем применять к методам действий, и которые имеют компактный синтаксис.

Эти атрибуты позволяют ASP.NET MVC выбирать метод действия на основе команды HTTP.

Например, запрос POST вызовет первый метод действия, а запрос PUT вызовет второй метод действия.

[код]
[HttpPost]
общедоступное редактирование ActionResult (int id)

[HttpPut]
общедоступное редактирование ActionResult (int id, тег Tag)
[/код]

В более ранних версиях ASP.NET MVC эти методы действий требовали более подробного синтаксиса, как показано в следующем примере.

[код]
[AcceptVerbs(HttpVerbs.Post)]
общедоступное редактирование ActionResult (int id)

[AcceptVerbs(HttpVerbs.Put)]
общедоступное редактирование ActionResult (int id, тег Tag)
[/код]

Поскольку браузеры поддерживают только глаголы HTTP GET и POST , невозможно опубликовать действие, для которого требуется другой глагол. Таким образом, невозможно изначально поддерживать все запросы RESTful .

Однако для поддержки запросов RESTful во время операций POST в ASP.NET MVC 2 представлен новый вспомогательный HTML-метод HttpMethodOverride .

Этот метод отображает скрытый элемент ввода, который заставляет форму эффективно эмулировать любой метод HTTP.

Например, с помощью вспомогательного HTML-метода HttpMethodOverride мы можем сделать отправку формы запросом PUT или DELETE .

Поведение HttpMethodOverride влияет на следующие атрибуты:

  • HttpPostAttribute
  • HttpPutAttribute
  • HttpGetAttribute
  • HttpDeleteAttribute
  • AcceptVerbsAttribute
11. Новый класс HiddenInputAttribute для шаблонных помощников:

Мы можем применить новый атрибут HiddenInputAttribute к свойству модели, чтобы указать, следует ли отображать скрытый элемент ввода при отображении модели в шаблоне редактора (атрибут устанавливает неявное значение UIHint для HiddenInput ).

Свойство DisplayValue позволяет указать, будет ли значение отображаться в режимах редактирования и отображения.

Если DisplayValue задано значение false, ничего не отображается, даже HTML-разметка, которая обычно окружает поле.

Значение по умолчанию для DisplayValue — true.

Мы можем использовать атрибут HiddenInputAttribute в следующих сценариях:

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

В этом случае значение и окружающая HTML-разметка (например, метка и значение) не отображаются.

Например:

[код]
открытый класс ProductViewModel
{
[HiddenInput] // эквивалентно [HiddenInput(DisplayValue=true)]
публичный идентификатор {получить; задавать; }

общедоступная строка Имя {получить; задавать; }

[Скрытый ввод (DisplayValue = false)]
открытый байт [] TimeStamp { получить; задавать; }
}
[/код]

12. Вспомогательный метод Html.ValidationSummary может отображать ошибки на уровне модели:

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

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

13. Шаблоны T4 в Visual Studio генерируют код, специфичный для целевой версии .NET Framework:

Новое свойство доступно для файлов T4 с узла ASP.NET MVC T4, которое указывает версию .NET Framework, используемую приложением.

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

В Visual Studio 2008 значение всегда равно .NET 3.5. В Visual Studio 2010 это значение равно .NET 3.5 или .NET4.

14. Улучшения API:

Добавлен защищенный виртуальный метод CreateActionInvoker в классе Controller.

Этот метод вызывается свойством ActionInvoker контроллера и допускает отложенное создание экземпляра вызывающего объекта, если он еще не установлен.