что такое mvc asp net
Общие сведения ASP.NET Core MVC
Автор: Стив Смит (Steve Smith)
ASP.NET MVC является многофункциональной платформой для создания веб-приложений и API-интерфейсов с помощью структуры проектирования Model-View-Controller.
Шаблон MVC
Структура архитектуры MVC разделяет приложение на три основных группы компонентов: модели, представлении и контроллеры. Это позволяет реализовать принципы разделения задач. Согласно этой структуре запросы пользователей направляются в контроллер, который отвечает за работу с моделью для выполнения действий пользователей и (или) получение результатов запросов. Контроллер выбирает представление для отображения пользователю со всеми необходимыми данными модели.
На следующей схеме показаны три основных компонента и существующие между ними связи.
Такое распределение обязанностей позволяет масштабировать приложение в контексте сложности, так как проще писать код, выполнять отладку и тестирование компонента (модели, представления или контроллера) с одним заданием. Гораздо труднее обновлять, тестировать и отлаживать код, зависимости которого находятся в двух или трех этих областях. Например, логика пользовательского интерфейса, как правило, подвергается изменениям чаще, чем бизнес-логика. Если код представления и бизнес-логика объединены в один объект, содержащий бизнес-логику, объект необходимо изменять при каждом обновлении пользовательского интерфейса. Это часто приводит к возникновению ошибок и необходимости повторно тестировать бизнес-логику после каждого незначительного изменения пользовательского интерфейса.
Представление и контроллер зависят от модели. Однако сама модель не зависит ни от контроллера, ни от представления. Это является одним из ключевых преимуществ разделения. Такое разделение позволяет создавать и тестировать модели независимо от их визуального представления.
Функции модели
Модель в приложении MVC представляет состояние приложения и бизнес-логику или операций, которые должны в нем выполняться. Бизнес-логика должна быть включена в состав модели вместе с логикой реализации для сохранения состояния приложения. Как правило, строго типизированные представления используют типы ViewModel, предназначенные для хранения данных, отображаемых в этом представлении. Контроллер создает и заполняет эти экземпляры ViewModel из модели.
Функции представления
Функции контроллера
Контроллеры — это компоненты для управления взаимодействием с пользователем, работы с моделью и выбора представления для отображения. В приложении MVC представление служит только для отображения информации. Обработку введенных данных, формирование ответа и взаимодействие с пользователем обеспечивает контроллер. В структуре MVC контроллер является начальной отправной точкой и отвечает за выбор рабочих типов моделей и отображаемых представлений (именно этим объясняется его название — он контролирует, каким образом приложение отвечает на конкретный запрос).
Контроллеры не должны быть чересчур сложными из-за слишком большого количества обязанностей. Чтобы не перегружать логику контроллера, перенесите бизнес-логику из контроллера в модель предметной области.
Если ваш контроллер часто выполняет одни и те же виды действий, переместите эти действия в фильтры.
ASP.NET Core MVC
ASP.NET Core MVC представляет собой упрощенную, эффективно тестируемую платформу с открытым исходным кодом, оптимизированную для использования с ASP.NET Core.
ASP.NET Core MVC предоставляет основанный на шаблонах способ создания динамических веб-сайтов с четким разделением задач. Она обеспечивает полный контроль разметки, поддерживает согласованную с TDD разработку и использует новейшие веб-стандарты.
Маршрутизация
Платформа ASP.NET Core MVC создана на основе маршрутизации ASP.NET Core — мощного компонента сопоставления URL-адресов, который позволяет создавать приложения с понятными и поддерживающими поиск URL-адресами. Вы можете определять шаблоны именования URL-адресов приложения, эффективно работающие для оптимизации для поисковых систем (SEO) и для создания ссылок, независимо от способа организации файлов на веб-сервере. Вы можете определять маршруты с помощью понятного синтаксиса шаблонов маршрутов, который поддерживает ограничения значений маршрутов, значения по умолчанию и необязательные значения.
Маршрутизация на основе соглашений позволяет глобально определять форматы URL-адресов, которые принимает приложение, и то, как каждый из этих форматов соответствует конкретному методу действия на данном контроллере. При поступлении входящего запроса модуль маршрутизации выполняет синтаксический анализ URL-адреса и соотносит его с одним из определенных форматов URL-адресов, а затем вызывает метод действия связанного контроллера.
Маршрутизация атрибутов используется для указания сведений о маршрутизации путем добавления атрибутов, определяющих маршруты приложения, к контроллерам и действиям. Это означает, что определения маршрутов помещаются рядом с контроллером и действием, с которым они связаны.
Привязка модели
Привязка модели в ASP.NET Core MVC преобразует данные запроса клиента (значения форм, данные маршрута, параметры строки запроса, заголовки HTTP) в объекты, которые может обрабатывать контроллер. В результате логике контроллера не требуется определять данные входящего запроса — данные просто доступны в виде параметров для методов действий.
Проверка модели
ASP.NET MVC поддерживает возможность проверки, дополняя модель объекта атрибутами проверки заметок к данным. Атрибуты проверки проверяются на стороне клиента до размещения значений на сервере, а также на сервере перед выполнением действия контроллера.
Платформа обрабатывает проверку данных запроса на клиенте и на сервере. Логика проверки, указанная в типах модели, добавляется в готовые для просмотра представления в виде ненавязчивых заметок и реализуется в браузере с помощью подключаемого модуля jQuery Validation.
Внедрение зависимостей
ASP.NET Core имеет встроенную поддержку внедрения зависимостей (DI). В ASP.NET MVC Core контроллеры могут запрашивать необходимые служб через свои конструкторы, предоставляя им возможность следовать принципу явных зависимостей.
Кроме того, приложение может использовать внедрение зависимостей в файлы представления с помощью директивы @inject :
Фильтры
Фильтры помогают разработчикам решать общие задачи, такие как обработка исключений или авторизация. Фильтры активируют пользовательскую логику предварительной и завершающей обработки для методов действий и могут быть настроены для запуска в определенные моменты в конвейерном выполнении определенного запроса. Фильтры могут применяться к контроллерам или действиям в виде атрибутов (или могут выполняться глобально). В состав платформы входит несколько фильтров (например, Authorize ). [Authorize] является атрибутом, который используется для создания фильтров авторизации MVC.
Области
области позволяют секционировать крупные ASP.NET Core веб-приложения MVC в более мелкие функциональные группы. Область является структурой MVC внутри приложения. В проекте MVC логические компоненты, такие как модель, контроллер и представление, находятся в разных папках, и для создания связи между этими компонентами MVC использует соглашения об именовании. Крупное приложение может быть целесообразно разделить на отдельные высокоуровневые области функциональности. Например, приложение электронной коммерции с несколькими подразделениями, например извлечение, выставление счетов и поиск и т. д. Каждое из этих устройств имеет собственные представления логических компонентов, контроллеры и модели.
Веб-API
Помимо того, что ASP.NET Core MV прекрасно подходит для создания веб-сайтов, эта платформа располагает мощной поддержкой для построения веб-API. Создавайте службы, доступные для широкого круга клиентов, включая браузеры и мобильные устройства.
Платформа поддерживает согласования содержимого HTTP со встроенной поддержкой для форматирования данных в виде JSON или XML. Пишите пользовательские модули форматирования для добавления поддержки собственных форматов.
Используйте функции создания ссылок для поддержки гипермедиа. Легко включайте поддержку общего доступа к ресурсам независимо от источника (CORS) для совместного использования веб-API в нескольких веб-приложениях.
Тестирование
Благодаря используемым интерфейсам и внедрению зависимостей платформа хорошо подходит для модульного тестирования. Кроме того, с помощью таких компонентов, как TestHost и поставщик InMemory для Entity Framework, можно быстро и просто выполнять интеграционные тесты. Узнайте больше о тестировании логики контроллеров.
Razor Просмотреть подсистему
ASP.NET Core представления MVC используют Razor обработчик представлений для отображения представлений. Razor — Это компактный, выразительный и жидкий язык разметки шаблонов для определения представлений с помощью встраиваемого кода C#. Razor используется для динамического создания веб-содержимого на сервере. Серверный код можно полностью комбинировать с содержимым и кодом на стороне клиента.
С помощью Razor обработчика представлений можно определять макеты, частичные представления и заменяемые разделы.
Строго типизированные представления
Razor представления в MVC могут быть строго типизированы на основе модели. Контроллеры передают строго типизированную модель в представления для поддержки в них IntelliSense и проверки типов.
Например, следующее представление отображает модель типа IEnumerable
Вспомогательные функции тегов
Вспомогательные функции тегов позволяют коду на стороне сервера принимать участие в создании и ОТРИСОВКЕ HTML-элементов в Razor файлах. Вспомогательные функции тегов используются для определения настраиваемых тегов (например, ) или для изменения поведения существующих тегов (например, ). Вспомогательные функции тегов привязываются к определенным элементам на основе имени элемента и его атрибутов. Они предоставляют преимущества отрисовки на стороне сервера, сохраняя при этом возможности редактирования HTML.
Существует множество встроенных вспомогательных функций тегов для общих задач — например, для создания форм, ссылок, загрузки ресурсов и т. д. Кроме того, огромное количество функций доступно в общедоступных репозиториях GitHub и в качестве пакетов NuGet. Вспомогательные функции тегов разрабатываются на C# и предназначены для HTML-элементов на основе имени элемента, имени атрибута или родительского тега. Например, встроенную функцию LinkTagHelper можно использовать для создания ссылки на действие AccountsController для Login :
С помощью EnvironmentTagHelper можно включать в приложения различные сценарии (например, необработанные или минифицированные) для конкретной среды выполнения (разработки, промежуточной или производственной):
Вспомогательные функции тегов обеспечивают удобный для HTML процесс разработки и расширенную среду IntelliSense для создания HTML и Razor разметки. Большинство встроенных вспомогательных функций тегов работают с существующими HTML-элементами и предоставляют для них атрибуты на стороне сервера.
Компоненты представлений
Компоненты представлений позволяют упаковывать логику отрисовки и повторно использовать ее в приложении. Они аналогичны частичным представлениям, но имеют связанную логику.
ASP.NET MVC 3
(включает обновление инструментов апреля 2011 г.)
Он устанавливает бок о бок с ASP.NET MVC 2, так что начать использовать его сегодня!
Лучшие функции
Лучшие ссылки
Что нового в ASP.NET MVC 3
Установка и справка
ASP.NET MVC 3 Overview
ASP.NET MVC 3 построен на ASP.NET MVC 1 и 2, добавляя отличные функции, которые упрощают код и позволяют более глубокое расширяемость. Эта тема содержит обзор многих новых функций, которые включены в этот выпуск, организованный в следующие разделы:
Расширяемые леса с интеграцией MvcScaffold
Новая система Scaffolding упрощает поиск и продуктивное использование, если вы совершенно новичок в инфраструктуре, и автоматизировать общие задачи разработки, если вы опытны и уже знаете, что делаете.
Это поддерживается новым NuGet леса пакет под названием MvcScaffolding. Термин «Scaffolding» используется многими программными технологиями для обозначения «быстро генерации основных набросков вашего программного обеспечения, которые вы можете затем отойти и настроить». Пакет строительных лесов, который мы создаем для ASP.NET MVC, очень выгоден в нескольких сценариях:
Другие функции в MvcScaffolding включают в себя:
Обновление инструментов ASP.NET MVC 3 включает в себя большую поддержку Visual Studio для этой системы строительных лесов, таких как:
Для получения дополнительной информации о Scaffolding в ASP.NET MVC 3, см.
Стив Сандерсон пост серии, в том числе:
Шаблоны html 5 проекта
Диалог нового проекта включает в себя флажок, включающий HTML 5 версии шаблонов проектов. Эти шаблоны используют Modernizr 1.7 для обеспечения поддержки совместимости HTML 5 и CSS 3 в браузерах нистого уровня.
Двигатель бритвы Представления
ASP.NET MVC 3 поставляется с новым двигателем представления под названием Razor, который предлагает следующие преимущества:
Некоторые новые функции Razor включают в себя следующее:
Razor также включает в себя новых помощников HTML, таких как:
Для получения дополнительной информации о Razor, см.
Поддержка нескольких двигателей view
Диалог-поле Add View в ASP.NET MVC 3 позволяет выбрать движок представления, с ним нужно работать, а диалоговая коробка New Project позволяет указать движок представления по умолчанию для проекта. Вы можете выбрать движок просмотра web Forms (ASPX), Razor или движок с открытым исходным кодом, например Spark, NHamlили NDjango.
Улучшения контроллера
Глобальные фильтры действий
Иногда требуется выполнить логику либо до запуска метода действия, либо после запуска метода действия. Для поддержки этого ASP.NET MVC 2 предоставили фильтры действий. Фильтры действий — это пользовательские атрибуты, которые предоставляют декларативные средства для добавления преддействий и пост-действия в конкретные методы действия контроллера. Однако в некоторых случаях может потребоваться указать преддействие или поведение после действия, которое применяется ко всем методам действия. MVC 3 позволяет указывать глобальные фильтры, добавляя их в коллекцию. GlobalFilters Для получения дополнительной информации о глобальных фильтрах действий см.
Новое свойство «ViewBag»
Контроллеры MVC 2 ViewData поддерживают свойство, позволяющее передавать данные в шаблон представления с помощью API словаря с поздним доступом. В MVC 3 можно также использовать несколько ViewBag более простой синтаксис с свойством для достижения той же цели. Например, вместо ViewData[«Message»]=»text» того, чтобы ViewBag.Message=»text» писать, можно написать. Вам не нужно определять какие-либо сильно набранные классы для использования ViewBag свойства. Поскольку это динамическое свойство, вместо этого можно просто получить или установить свойства, и это позволит решить их динамически во время выполнения. Внутренне ViewBag свойства хранятся в словаре в ViewData виде пар имен/значений. (Примечание: в большинстве предварительных версий ViewBag MVC 3, свойство было названо свойством.) ViewModel
Новые типы «ActionResult»
Следующие ActionResult типы и соответствующие методы помощи являются новыми или усовершенствованными в MVC 3:
Улучшения JavaScript и Ajax
По умолчанию Ajax и валидаторы в MVC 3 используют ненавязчивый подход JavaScript. Ненавязчивый JavaScript позволяет избежать впрыскивания внеочередных JavaScript в HTML. Это делает HTML меньше и менее суматоху, и делает его легче обмениваться или настроить библиотеки JavaScript. Помощники по проверке в MVC 3 также используют jQueryValidate плагин по умолчанию. Если вы хотите поведение MVC 2, вы можете отключить ненавязчивый JavaScript с помощью настройки файла web.config. Для получения дополнительной информации об улучшениях JavaScript и Ajax см.
Проверка на стороне клиента включена по умолчанию
В более ранних версиях MVC необходимо Html.EnableClientValidation явно вызвать метод из представления, чтобы включить проверку на стороне клиента. В MVC 3 это больше не требуется, поскольку проверка на стороне клиента включена по умолчанию. (Вы можете отключить это с помощью параметра в файле web.config.)
Для того, чтобы проверка на стороне клиента работала, вам все равно необходимо ссылаться на соответствующие библиотеки проверки j’ery и j’ery на вашем сайте. Вы можете разместить эти библиотеки на своем сервере или ссылаться на них из сети доставки контента (CDN), как CDNs от Microsoft или Google.
Удаленный валидатор
ASP.NET MVC 3 поддерживает новый класс RemoteAttribute, который позволяет воспользоваться преимуществами поддержки удаленного валидатора j’s Validation. Это позволяет библиотеке проверки на стороне клиента автоматически вызывать пользовательский метод, который вы определяете на сервере, чтобы выполнить логику проверки, которая может быть сделана только на стороне сервера.
В следующем примере Remote атрибут указывает, что проверка клиента вызовет UserNameAvailable действие, UsersController названное в UserName классе, чтобы проверить поле.
В следующем примере показан соответствующий контроллер.
Для получения дополнительной информации Remote о том, как использовать атрибут, см. Как: Реализация удаленной проверки в ASP.NET MVC в библиотеке MSDN.
Поддержка связывания JSON
ASP.NET MVC 3 включает в себя встроенную привязку JSON, которая позволяет методам действий получать закодированные данные JSON и связывать их с параметрами экшн-метода. Эта возможность полезна в сценариях, связанных с шаблонами клиентов и привязкой данных. (Клиентские шаблоны позволяют форматировать и отображать один элемент данных или набор элементов данных с помощью шаблонов, выполняемых на клиенте.) MVC 3 позволяет легко соединять клиентские шаблоны с методами действий на сервере, которые отправляют и получают данные JSON. Для получения дополнительной информации о JSON обязательной поддержки, см JavaScript и AJAX Улучшения разделе MVC 3 Скотт Гатри в блоге.
Улучшения проверки модели
Атрибуты метаданных «DataAnnotations»
Класс «ВалидацияАтрибут»
Интерфейсы проверки
Интерфейс IValidatableObject позволяет выполнять проверку на уровне модели, а также предоставлять сообщения об ошибках проверки, характерные для состояния общей модели, или между двумя свойствами в модели. MVC 3 теперь извлекает ошибки из IValidatableObject интерфейса при присваивании модели, и автоматически флаги или подчеркивает пострадавших полей в представлении с помощью встроенных помощников HTML форме.
Интерфейс IClientValidatable позволяет ASP.NET MVC обнаружить во время выполнения, имеет ли валидатор поддержку для проверки клиента. Этот интерфейс был разработан таким образом, чтобы его можно было интегрировать с различными рамками проверки.
Для получения дополнительной информации о интерфейсах проверки, Scott Guthrie’s MVC 3 Preview blog post см. (Однако, обратите внимание, что ссылка на «IValidateObject» в блоге должна быть «IValidatableObject».)
Улучшение инъекций зависимости
ASP.NET MVC 3 обеспечивает лучшую поддержку для применения инъекций зависимостей (DI) и для интеграции с контейнерами для инъекций зависимостей или инверсии контроля (IOC). Поддержка DI была добавлена в следующих областях:
MVC 3 поддерживает библиотеку Common Service Locator и любой контейнер DI, поддерживающий IServiceLocator интерфейс этой библиотеки. Он также поддерживает IDependencyResolver новый интерфейс, который упрощает интеграцию платформ DI.
Для получения дополнительной информации о DI в MVC 3, см.
Другие новые функции
Интеграция NuGet
С обновлением ASP.NET 3 Tools, шаблоны проектов включают в себя библиотеки JavaScript, предварительно установленные пакеты NuGet, поэтому они обновляются через NuGet. Система Entity Framework Code First также предварительно устанавливается в виде пакета NuGet.
Дополнительные сведения о NuGet см. в документации по NuGet.
Кэшинг вывода частичной страницы
ASP.NET MVC поддерживает кэширование полных страниц с версии 1. MVC 3 также поддерживает частичное кэширование вывода страниц, что позволяет легко кэшировать области или фрагменты ответа. Для получения дополнительной информации о кэширования, см Частичное страницы Выход Кэшинг раздел Скотт Гатри в блоге на MVC 3 релиз кандидата и ребенка действий выход кэширования разделе MVC 3 Релиз Примечания.
Детальный контроль за проверкой запроса
ASP.NET MVC имеет встроенную проверку запроса, которая автоматически помогает защититься от атак XSS и HTML-инъекций. Однако иногда требуется явно отключить проверку запроса, например, если вы хотите, чтобы пользователи размещали HTML-контент (например, в записях в блоге или содержимом CMS). Теперь можно добавить атрибут AllowHtml к моделям или моделям представления, чтобы отключить проверку запроса на основе свойств во время связывания модели. Для получения дополнительной информации о проверке запроса см.
Расширяемый «Новый проект» Диалог Box
В ASP.NET MVC 3 вы можете добавить шаблоны проектов, двигатели представления и модульные тестовые платформы проекта в диалоговую коробку New Project.
Улучшения в лесах шаблонов
ASP.NET mVC 3 шаблоны строительных лесов лучше определяют свойства первичного ключа на моделях и правильно ею, чем в предыдущих версиях MVC. (Например, шаблоны строительных лесов теперь убедитесь, что основной ключ не является эшафот, как editable поле формы.)
По умолчанию, Создать и edit леса Html.EditorFor теперь использовать Html.TextBoxFor помощника вместо помощника. Это улучшает поддержку метаданных по модели в виде атрибутов аннотации данных при создании представления диалогового окна Add View.
Новые перегрузки для «Html.LabelFor» и «Html.LabelForModel»
Для методов LabelFor LabelForModel и помощников были добавлены новые перегрузки метода. Новые перегрузки позволяют указать или переопределить текст метки.
Поддержка контроллера без сеансов
В ASP.NET MVC 3 вы можете указать, хотите ли вы использовать состояние сеанса в классе контроллера, и если да, то следует ли читать/писать или читать только состояние сеанса. Для получения дополнительной информации о поддержке контроллера безсеансов см.
Новый класс «ДополнительныеметаданныеАтрибут»
Для заполнения ModelMetadata.AdditionalValues словаря для свойства модели можно использовать атрибут AdditionalMetadata. Например, если модель представления имеет свойство, которое должно отображаться только администратору, можно аннотировать это свойство, как показано в следующем примере:
Эти метаданные становятся доступными для любого шаблона отображения или редактора при визуализации модели представления продукта. Это до вас, чтобы интерпретировать информацию о метаданных.
Улучшения AccountController
Учетный контроллер в шаблоне проекта Интернет был значительно улучшен.
Новый шаблон проекта интрасети
В комплект входит новый шаблон проекта Intranet, который позволяет аутентификации Windows и удаляет учетную записьController.
MVC Framework: большое введение для начинающих
Необходимое отступление: не так давно я разместил статью предназначавшуюся для печатного издания. Приведенная ниже статья имеет ту же самую судьбу: она не попала в печать в связи с тяжелым положением журнала. Как и в прошлый раз, я решил опубликовать статью на Хабре, благо тематика попадает под формат. Необходимо заметить, что статья оформлена и содержит текст для журнала, если бы она готовилась для Хабра, то некоторые часть могли бы быть изменены. Надеюсь, статья вам понравится.
O MVC
Паттерн Модель-представление-контроллер или по-английски Model-view-controller используется очень давно. Еще в 1979 году его описал Тригве Реенскауг в своей работе «Разработка приложений на Smalltalk-80: как использовать Модель-представление-контроллер». С тех пор паттерн зарекомендовал себя как очень удачная архитектура программного обеспечения.
Пользователь, работая с интерфейсом, управляет контроллером, который перехватывает действия пользователя. Далее контроллер уведомляет модель о действиях пользователя, тем самым изменяя состояние модели. Контроллер также уведомляет представление. Представление, используя текущее состояние модели, строит пользовательский интерфейс.
Основой паттерна является отделение модели данных приложения, его логики и представления данных друг от друга. Таким образом, следуя правилу «разделяй и властвуй», удается строить стройное программное обеспечение, в котором, во-первых, модель не зависит от представления и логики, а во-вторых, пользовательский интерфейс надежно отделен от управляющей логики.
ASP.NET MVC Framework
С другой стороны, MVC Framework не предполагает использование классических web-форм и web-элементов управления, в нем отсутствуют такие механизмы как обратные вызовы (postbacks) и состояние представления (viewstate). MVC Framework так же предлагает использование URL-mapping и архитектуру REST в качестве модели запросов, что положительно повлияет на поисковую оптимизацию web-проектов.
— | Классический ASP.NET | MVC |
Модель запросов | postback | REST |
Модель данных | через код cs-файла страницы (code-behind) | определяется паттерном MVC |
Разработка интерфейса | web-controls | чистый html, MVC UI Helpers |
Авто-генерация id | да | нет |
ViewState | есть | нет |
URL mapping | нет | есть |
В целом, высказывая свое мнение, я могу сказать, что MVC Framework предложил для разработчиков ASP.NET новый стиль, ориентированный на качество клиентского кода. Генерируемый MVC код страниц не содержит ничего автоматически создаваемого, здесь нет раздутых идентификаторов, нет огромных viewstate, написание клиентских скриптов упрощено в связи с тем, что код страницы представляет собой чистый, созданный самим программистом HTML. В эпоху, когда понятие web 2.0 прочно вошло в нашу жизнь полный контроль над страницей на клиентской стороне – это залог успеха любого web-проекта.
Версии MVC Framework
Советы
Как задать на странице html-элемент select
var products = GetProducts();
ViewData[«sampleSelect»] = new SelectList(products, «Id», «Name»);
Где
GetProducts – это некий метод, источник данных в виде IEnumerable, такие источники данных следует располагать в модели данных, здесь приведено упрощенно для примера;
SelectList – это вспомогательный класс определенный в System.Web.MVC.
Здесь, через ViewData передается набор данных созданных с помощью класса SelectList, конструктор которого через первый параметр принимает данные в виде products. Имена свойств, определенных в классе Product, для значений и выводимого текста в select передается вторым и третьим параметрами.
Как отобразить пользовательский элемент управления
Для того чтобы отобразить свой элемент управления используется представленный в preview 5 метод Html.RenderPartial(. ). Для того чтобы использовать пользовательский элемент управления в своих проектах он должен быть создан как MVC View User Control, а не как обычный Web User Control. Разница заключается в том, от какого класса наследуется созданный элемент. В случае MVC, элемент будет наследоваться от System.Web.Mvc.ViewUserControl.
Вывод пользовательского элемента не составляет труда:
Где SampleUserCtrl – это имя класса, который представляет пользовательский элемент управления.
Как присвоить элементу, созданному через класс Html, атрибут class
Когда мало ViewData
Разделяем логику GET и POST запросов
[AcceptVerbs( «GET» )]
public ActionResult Login()
<
return View( «Index» );
>
Управление кэшированием
MVC Framework позволяет управлять кэшированием результата каждого action. То есть, вы можете задать каким образом и сколько будет кэшироваться тот или иной запрос на сервере или на клиенте. Для этого существует аналог директивы классического asp.net атрибут [OutputCache]. Ниже перечислены его параметры:
Параметр | Описание |
VaryByHeader | строка с разделенными через точку с запятой значениями http-заголовков по которым будет производиться условное кэширование |
VaryByParam | задает условное кэширование основанное на значениях строки запроса при GET или параметров при POST |
VaryByContentEncoding | указывает условие кэширование в зависимости от содержимого директивы http-заголовка Accept-Encoding |
Duration | Duration задает значение времени в секундах, в течение которого страница или пользовательский элемент кэшируются |
NoStore | принимает булево значение. Если значение равно true, то добавляет в директиву http-заголовка Cache-Control параметр no-store |
CacheProfile | используется для указания профиля кэширования заданного через web.config и секцию caching |
OutputCacheLocation | этот параметр описывает правило для места хранения кэша и принимает одно из значений перечисления OutputCacheLocation |
VaryByCustom | любой текст для управление кэшированием. Если этот текст равен «browser», то кэширование будет производиться условно по имени браузера и его версии (major version). Если у VaryByCustom будет указана строка, то вы обязаны переопределить метод GetVaryByCustomString в файле Global.asax для осуществления условного кэширования. |
Использование OutputCache очень элементарное. Следующий пример показывает, как кэшировать результат action Index на 10 секунд.
Сложные страницы и пользовательские модели
Зачастую в создании страниц участвует множество самых разнородных данных. Скажем, на персональной странице пользователя какого-либо портала могут быть данные с его избранными новостями, данные его профиля, данные о сообщениях посланных ему другими участниками, данные о погоде или дата и точное время, и еще масса разных данных.
Такие данные при хранении в базах данных хранятся не в одной таблице, а в нескольких, может даже в нескольких десятках. В таком случае, если вы используете ОRM – объектную модель базы данных, то для создания одной страницы MVC Framework вам придется инициализировать множество списочных или других переменных и заполнить их данными.
Я рекомендую в таком случае сделать свою комплексную модель данных, реализовав букву M из слова MVC. Ниже я приведу пример одного из вариантов реализации такой модели:
public class BankInfoModel
<
public Bank Bank;
public IEnumerable BankBranches;
>
Создается модель, которая содержит значение Bank и перечисление всех отделений этого банка (допустим, по ряду причин, мы не можем получить список отделений просто через Bank).
Для прозрачного использования нашей модели мы должны сделать следующее: переделать базовый класс нашего представления с
public partial class Index: ViewPage
public partial class Index : ViewPage
Теперь, в коде представления, нам доступен инстанцированный экземпляр модели типа BankInfoModel через ViewData.Model. Конечно, контроллер должен его инициализировать для нас, но это элементарно:
Где int? id – это параметр, который указывает на идентификатор банка
Использование экземпляра нашей модели в представлении также просто:
div class =»vcard» >
h1 > span class =»fn org» > =ViewData.Model.Bank.shortName %> span > h1 >
p > Телефон: span class =»fn phone» > =ViewData.Model.Bank.phone %> span > p >
div >
Сложные типы, ModelBinder
[AcceptVerbs(«POST»)]
public ActionResult Login(string userLogin, string userPass)
public class LoginModel
<
public string userLogin < get ; set ; >
public string userPass
public class LoginModelBinder : IModelBinder
<
public object GetValue(ControllerContext controllerContext, string modelName,
Type modelType, ModelStateDictionary modelState)
Обратите внимание, мы определяем метод GetValue и заполняем в нем данные модели через контекст запроса.
Перед заключительным шагом нам необходимо указать для нашего класса модели LoginModel атрибут ModelBinder:
[ModelBinder( typeof (LoginModelBinder))]
public class LoginModel
<
public string userLogin < get ; set ; >
public string userPass
[AcceptVerbs(«POST»)]
public ActionResult Login([ModelBinder(typeof(LoginModelBinder))] LoginModel loginModelData)
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Login(LoginModel loginModelData)
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Login([Bind(Prefix=””, Include=”userLogin, userPass”)] LoginModel loginModelData)
И хотя мы не обязаны создавать свои варианты ModelBinder этот инструмент все же может пригодиться и будет полезным для тонкой настройки обработки значений комплексных типов переданных с формы.
Перехват необработанных ошибок, неверных URL
Известно, что ничего так не сбивает с толку пользователя как непонятная ошибка, возникшая на ровном месте. Даже, если в вашем проекте такие ошибки время от времени происходят, необходимо позаботится о том, чтобы пользователь получал уведомление как можно более дружелюбно. Для таких целее используются страницы ошибок, перехват необработанных исключений, а так же обработка 404 ошибки http «Страница не найдена».
Для перехвата необработанных исключений необходимо создать в папке Views/Shared страницу Error.aspx с информацией об ошибке, которая содержит, например, такой код:
span >
Ой! Извините, но на нашей странице произошла ошибка. br />
Текст ошибки: = ViewData.Model.Exception.Message %>
span >
[HandleError]
public class HomeController: Controller
public class ErrorController : Controller
<
public ActionResult Index()
<
return RedirectToAction( «Http404» );
>
public ActionResult Http404()
<
Response.StatusCode = 404;
return View();
>
>
h1 > 404 h1 >
p > Запрошенной страницы не существует p >
customErrors mode =»RemoteOnly» >
error statusCode =»404″ redirect =»
Таким образом, все наши пользовательские исключения типа 404 будут также перенаправляться на нашу страницу Http404.aspx, что позволит сохранить общий подход и объединить под понятие «ненайденной страницы» как неверные URL, так и URL-введенные с ошибкой или в силу каких-то других причин неприемлемые для обработки, например из-за нарушения прав доступа.
Следует учесть, что для правильно работы перехвата ошибок в IIS7 требуется выставить следующие параметры в разделе «Страницы ошибок» настроек вашего сайта.
Заключение
В статье я попытался описать некоторые аспекты работы с MVC Framework. Многие моменты – элементарны, некоторые не так просты, как кажутся, часть – хорошо описана в интернете, часть – не описана вовсе. Во всех случаях приведенный материал может сослужить хорошую службу как начинающим знакомство с MVC Framework, так и тем, кто уже имеет опыт создания web-приложений с его помощью.
MVC Framework сегодня – это, всего лишь, бета-версия того продукта, который будет в итоге. Но уже сейчас этот инструмент позволяет создавать web-приложения, используя все мощь паттерна MVC. Возможно, когда вы будете читать эту статью, выйдет финальный релиз MVC Framework, который ожидается к концу 2008 года, но можно предположить, что большинство функций уже не будет изменено.