Шаблоны проектирования — образцы шаблонов MVC для начинающих
В нем объясняется, что такое шаблон MVC и что такое ASP.NET MVC Framework, как он работает. Также объясняет жизненный цикл страницы ASP.NET MVC и функции ASP.NET MVC в зависимости от версии.
В примерах представлены пошаговые инструкции, которые помогут новичкам легко понять и освоить ASP.NET MVC.
Поскольку все мы знаем множество шаблонов проектирования и используем их при реализации бизнес-компонентов и сервисов в наших приложениях, мы все равно будем сталкиваться с проблемами/проблемами с нашими приложениями. Также изо дня в день потребности бизнеса и приоритеты будут меняться. Если мы внимательно посмотрим на ряд проблем, дефектов и проблем, с которыми мы сталкиваемся, это уровни пользовательского интерфейса и представления. Хотя некоторые дефекты связаны с бизнес-логикой и бизнес-правилами, нам может потребоваться исправить их на уровнях пользовательского интерфейса и представления, поскольку мы можем тесно интегрировать бизнес-логику в уровни пользовательского интерфейса и представления. Причина этого в том, что мы не сосредоточились на реализации правильного шаблона проектирования в наших приложениях. Давайте пройдем шаг за шагом и поймем, как реализовать и использовать шаблон представления в наших приложениях.
Постановка задачи:
- Уже используются разные шаблоны в приложении, но по-прежнему сложно поддерживать приложение.
- Использование VS Test, NUnit, MBUnit и т.д. Для тестирования уровня бизнес-логики, но в приложении все еще существуют некоторые дефекты, поскольку бизнес-логика задействована на уровне представления.
- Используемый уровень представления, уровень бизнес-логики, уровень доступа к данным в приложении, но иногда все еще необходимо писать избыточный код на уровне представления для использования или вызова других модулей или других вариантов использования.
- Дефекты интеграции появляются, когда мы вносим некоторые изменения в интегрированные модули.
- Исправление дефектов и усовершенствования требуют больше времени для анализа логики уровня представления и ее интеграционных зависимостей, что приводит к открытию новых дефектов.
- ASP.NET MVC нельзя выбрать, поскольку пользовательский интерфейс сложен для создания.
Основная причина проблемы:
В слое представления
- Страница или форма содержит элементы управления, отображающие данные домена приложения. Пользователь может изменять данные и отправлять изменения. Страница извлекает данные домена, обрабатывает пользовательские события, изменяет другие элементы управления на странице в ответ на события и отправляет измененные данные домена. Включение кода, выполняющего эти функции, в веб-страницу Кроме того, трудно совместно использовать код между веб-страницами, требующими одинакового поведения. сложный класс, его трудно поддерживать и трудно тестировать.
- Уровень пользовательского интерфейса, логика пользовательского интерфейса, логика представления, бизнес-логика тесно связаны между собой.
- Уровень представления отвечает за интеграцию модулей или вариантов использования.
Решение:
- Выберите лучший шаблон уровня представления, чтобы разделить уровень пользовательского интерфейса, логику пользовательского интерфейса и логику представления, а также бизнес-логику как отдельные слои, чтобы упростить понимание и поддержку кода.
- Включите слабую связь при разработке модулей или любых вариантов использования.
- Максимизируйте код, который можно протестировать с помощью автоматизации. (Представления трудно проверить.)
- Делитесь кодом между страницами, требующими одинакового поведения.
- Разделите обязанности по визуальному отображению и поведению обработки событий на разные классы с именами, соответственно, представления и презентатора, или контроллера, или ViewModel.
Преимущества использования шаблона презентации:
- Модульность
- Подход, основанный на тестировании — максимизируйте код, который можно протестировать с помощью автоматизации.
- Разделение интересов
- Совместное использование кода между страницами и формами
- Простота обслуживания
Какие шаблоны уровня представления доступны?
MVC (контроллер представления модели)
MVP (презентатор представления модели) или (пассивное представление модели, контроллер супервизора)
MVVM (представление модели ViewModel)
MVC против MVP против MVVM:
-
Модель и представление представляют одно и то же во всех трех вышеперечисленных шаблонах?
Да
-
Цель Controller, Presenter и ViewModel одинакова во всех трех вышеперечисленных шаблонах?
Да
-
Связь и поток моделей, представлений с контроллером, презентаторов и ViewModel одинаковы?
Нет, именно поэтому существуют эти 3 шаблона.
-
Являются ли эти шаблоны заменой PL (уровень представления), BLL (уровень бизнес-логики) и DAL (уровень доступа к данным)
Нет, эти шаблоны предназначены для отделения пользовательского интерфейса и логики пользовательского интерфейса от логики представления и обеспечивают слабую связь.
Выберите лучший шаблон слоя презентации:
Лучший игрок
- Привязка через контекст данных невозможна
- Сложный дизайн пользовательского интерфейса
- Лучше всего подходит для Windows Forms, ASP.NET Web Forms и приложений Sharepoint
МВК
- Лучше всего для ASP.NET с простым пользовательским интерфейсом
- Отключенная модель (просмотр отделен от всех других слоев)
Примечание. Здесь я не сосредотачиваюсь на MVC VM (MVC ViewModel из MVC3) и ASP.NET MVVM с внедрением зависимостей.
МВВМ
- Возможна привязка через datacontext
- Подключенная модель
- Лучше всего подходит для приложений WPF и Silverlight
Веб-формы ASP.NET против ASP.NET MVC:
Веб-формы ASP.NET
- РАД
- Более легкая разработка
- Богатая экосистема управления
- Знакомый подход к разработке для Windows Forms
- Нет
ViewState
и нет поддержки постбэка
ASP.NET MVC
- Чистое разделение ответственности (SoC)
- Полный контроль разметки
- Включить TDD (разработка через тестирование)
- Включить и легко сделать REST
- Более простая интеграция на стороне клиента (Javascript)
- Multi View Engine (это действительно круто!)
- Нет поддержки ViewState и обратной передачи
- Расширяемость и поддержка WEB 2.0
Модель, представления и контроллер
- Модель. Объекты модели — это части приложения, которые реализуют логику предметной области приложения. Часто объекты модели извлекают и сохраняют состояние модели в базе данных. Например, объект Product может извлекать информацию из базы данных, работать с ней, а затем записывать обновленную информацию обратно в таблицу Products в SQL Server.
- Представления. Представления — это компоненты, которые отображают пользовательский интерфейс приложения (UI). Обычно этот пользовательский интерфейс создается из данных модели. Примером может служить представление редактирования таблицы «Продукты», в котором отображаются текстовые поля, раскрывающиеся списки и флажки в зависимости от текущего состояния объекта «Продукты».
- Контроллер. Контроллеры — это компоненты, которые обрабатывают взаимодействие с пользователем, работают с моделью и, в конечном итоге, выбирают представление для визуализации, отображающее пользовательский интерфейс. В приложении MVC представление отображает только информацию; контроллер обрабатывает и реагирует на ввод и взаимодействие пользователя. Например, контроллер обрабатывает значения строки запроса и передает эти значения модели, которая, в свою очередь, запрашивает базу данных, используя значения.
Жизненный цикл страницы высокого уровня ASP.NET MVC?
Жизненный цикл низкоуровневой страницы ASP.NET MVC?
Новые возможности MVC2.0
1 шаблон помощников:
Шаблонные помощники помогают нам автоматически связывать HTML-элементы для редактирования и отображения с типами данных.
Например, когда данные типа System.DateTime
отображаются в представлении, элемент пользовательского интерфейса средства выбора даты может отображаться автоматически.
Это похоже на то, как шаблоны полей работают в динамических данных ASP.NET.
2 области:
Использование областей Мы можем разбить большой проект на несколько меньших разделов, чтобы справиться со сложностью большого веб-приложения.
Каждый раздел («область») обычно представляет собой отдельный раздел большого веб-сайта и используется для группировки связанных наборов контроллеров и представлений.
Например
Areas
Admin
Controllers
Models
Views
Iniala Claims
Controllers
Models
Views
3 Поддержка асинхронных контроллеров:
ASP.NET MVC2 позволяет контроллерам обрабатывать запросы асинхронно.
Это может привести к повышению производительности, позволяя серверам, которые часто вызывают блокирующие операции (например, сетевые запросы), вместо этого вызывать неблокирующие аналоги.
4 Поддержка DefaultValueAttribute
параметров метода действия:
Класс System.ComponentModel.DefaultValueAttribute
позволяет указать значение по умолчанию для параметра аргумента метода действия.
Например, предположим, что определен следующий маршрут по умолчанию:
{controller}/{action}/{id}
Также предположим, что определены следующие контроллер и метод действия:
public class ArticleController
{
public ActionResult View(int id, [DefaultValue(1)]int page)
{
}
}
Любой из следующих URL-адресов запроса вызовет метод действия View, определенный в предыдущем примере.
- /Статья/Просмотреть/123
- /Article/View/123?page=1 (фактически то же самое, что и предыдущий запрос)
- /Статья/Просмотр/123?page=2
5 Поддержка привязки двоичных данных с помощью связывателей моделей:
Есть две новые перегрузки Html.Hidden
помощника, которые кодируют двоичные значения как строки в кодировке base-64:
public static string Hidden(this HtmlHelper htmlHelper, string name, Binary value);
public static string Hidden(this HtmlHelper htmlHelper, string name, byte[] value);
6 Поддержка DataAnnotations
атрибутов:
Использование атрибутов RangeAttribute
, RequiredAttribute
, StringLengthAttribute
и RegexAttribute
проверки (определенных в System.ComponentModel.DataAnnotations
пространстве имен), когда мы привязываемся к модели, чтобы обеспечить проверку ввода.
using System.ComponentModel.DataAnnotations;
namespace MvcTmpHlprs
{
[MetadataType(typeof(ProductMD))]
public partial class Product
{
public class ProductMD
{
public object SellStartDate { get; set; }
[UIHint("rbDate")]
public object SellEndDate { get; set; }
[DataType(DataType.Date)]
public object DiscontinuedDate { get; set; }
[ScaffoldColumn(false)]
public object ModifiedDate { get; set; }
[ScaffoldColumn(false)]
public object rowguid { get; set; }
[ScaffoldColumn(false)]
public object ThumbnailPhotoFileName { get; set; }
}
}
}
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]
public ActionResult Edit(int id)
[HttpPut]
public ActionResult Edit(int id, Tag tag)
В более ранних версиях ASP.NET MVC эти методы действий требовали более подробного синтаксиса, как показано в следующем примере.
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(int id)
[AcceptVerbs(HttpVerbs.Put)]
public ActionResult Edit(int id, Tag tag)
Поскольку браузеры поддерживают только глаголы HTTP GET
и POST
, невозможно опубликовать действие, для которого требуется другой глагол. Таким образом, невозможно изначально поддерживать все RESTful
запросы.
Однако для поддержки RESTful
запросов во время POST
операций в ASP.NET MVC 2 представлен новый HttpMethodOverride
вспомогательный метод HTML.
Этот метод отображает скрытый элемент ввода, который заставляет форму эффективно эмулировать любой метод HTTP.
Например, с помощью HttpMethodOverride
вспомогательного метода HTML мы можем сделать так, чтобы отправка формы выглядела как запрос PUT
или .DELETE
Поведение HttpMethodOverride
влияет на следующие атрибуты:
HttpPostAttribute
HttpPutAttribute
HttpGetAttribute
HttpDeleteAttribute
AcceptVerbsAttribute
11 Новый HiddenInputAttribute
класс для шаблонных помощников:
Мы можем применить новый HiddenInputAttribute
атрибут к свойству модели, чтобы указать, следует ли отображать скрытый элемент ввода при отображении модели в шаблоне редактора (этот атрибут задает неявное UIHint
значение HiddenInput
).
Свойство атрибута DisplayValue
позволяет указать, будет ли значение отображаться в режимах редактирования и отображения.
Когда DisplayValue
установлено значение false, ничего не отображается, даже HTML-разметка, которая обычно окружает поле.
Значение по умолчанию для DisplayValue
true.
Мы можем использовать HiddenInputAttribute
атрибут в следующих сценариях:
- Когда представление позволяет пользователям редактировать идентификатор объекта, необходимо отобразить значение, а также предоставить скрытый элемент ввода, содержащий старый идентификатор, чтобы его можно было передать обратно контроллеру.
- Когда представление позволяет пользователям редактировать двоичное свойство, которое никогда не должно отображаться, например свойство временной метки.
В этом случае значение и окружающая HTML-разметка (например, метка и значение) не отображаются.
Например:
public class ProductViewModel
{
[HiddenInput] // equivalent to [HiddenInput(DisplayValue=true)]
public int Id { get; set; }
public string Name { get; set; }
[HiddenInput(DisplayValue=false)]
public byte[] TimeStamp { get; set; }
}
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
свойством Controller и допускает отложенное создание экземпляра вызывающего объекта, если он еще не установлен.