Добавление класса модели. Проектирование модели данных

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

Набросаем план

Давайте представим себе, что подруга решила провести вечеринку в канун Нового года, и что она попросила нас создать веб сайт, который позволит ее друзьям и знакомым принять приглашение с RSVP (подпись на приглашении, призывающая получателя дать ответ об участии в мероприятии). На сайте должно присутствовать следующее:

  • Главная страница, где отображается информация о вечеринке
  • Форма, которая может быть использована для RSVP
  • Валидация RSVP формы, которая отобразит страницу с благодарностью
  • Заполненный и отправленный ответ о согласии принять участие в вечеринке

В следующих разделах мы будем наращивать MVC проект, который мы создали в начале главы, и добавим эти возможности. Мы можем сделать первый пункт из списка, применив те знания то, которые мы получили ранее, то есть мы можем добавить HTML для наших существующих представлений, где будет дана подробная информация о вечеринке. В показаны дополнения, которые мы сделали в файле Views/Home/Index.cshtml .

Листинг 2-7: Отображение информации о вечеринке
@{ Layout = null; } Index

We"re going to have an exciting party.
(To do: sell it better. Add pictures or something.)

Мы на правильном пути. Если вы запустите приложение, вы увидите информацию о вечеринке, ну, вернее, метку-заполнитель (placeholder) для этой информации, но вы можете уловить суть. Пример показан на .

Рисунок 2-12: Добавление представления

Проектирование модели данных

В MVC М обозначает модель , и это является самой важной частью приложения. Модель является представлением реальных объектов, процессов и правил, которые определяют объект, известный как домен , нашего приложения. Модель, которая часто упоминается как доменная модель , содержит C# объекты (известные как доменные объекты ), которые составляют суть нашего приложения, и методы, которые позволяют нам манипулировать ими. Представления и контроллеры раскрывают домен клиентам в согласованном порядке, и хорошо продуманное MVC приложение начинается с хорошо продуманной модели, которая затем является координационным центром, когда мы добавляем контроллеры и представления.

Нам не нужна сложная модель для приложения PartyInvites , но мы создадим один доменный класс, которые мы назовем GuestResponse . Этот объект будет отвечать за хранение, проверку и подтверждение RSVP.

Добавление класса модели

По MVC соглашению классы, которые составляют модель, помещаются в папку Models . Щелкните правой кнопкой мыши по Models в окне Solution Explorer и выберите Add , за которым следует Class , из всплывающего меню. Назовите файл GuestResponse.cs и нажмите кнопку Add , чтобы создать класс. Измените содержимое класса в соответствии с.

Совет

Если у вас нет пункта меню Class , то вы, вероятно, оставили работать отладчик (дебаггер) Visual Studio. Visual Studio ограничивает изменения, которые можно внести в проект, если приложение запущено.

Листинг 2-8: Доменный класс GuestResponse
namespace PartyInvites.Models { public class GuestResponse { public string Name { get; set; } public string Email { get; set; } public string Phone { get; set; } public bool? WillAttend { get; set; } } }

Совет

Вы, возможно, заметили, что свойство WillAttend имеет тип bool? (Nullable), то есть оно может быть true , false или null . Мы объясним это в разделе «Добавление валидации» далее в этой главе.

Ссылка на метод действия

Одна из целей нашего приложение заключается во включении RSVP формы, поэтому нам нужно добавить ссылку на нее из нашего представления Index.cshtml , как показано в .

Листинг 2-9: Добавление ссылки для RSVP формы
@{ Layout = null; } Index
@ViewBag.Greeting World (from the view)

We"re going to have an exciting party.
(To do: sell it better. Add pictures or something.)

@Html.ActionLink("RSVP Now", "RsvpForm")

Html.ActionLink является вспомогательным методом HTML. MVC Framework разработан с набором встроенных вспомогательных методов, которые удобны для обработки HTML ссылок, текстовых вводных данных, флажков, выборок и даже пользовательских элементов управления. Метод ActionLink принимает два параметра: первый – это текст для отображения в ссылке, а второй – это выполняемое действие, когда пользователь нажимает на ссылку. Мы объясним вспомогательные методы HTML в главах 19-21. На показана ссылка, которую мы добавили.

Рисунок 2-13: Добавление в представление ссылки

Если вы наведете курсор мыши на ссылку в браузере, вы увидите, что ссылка указывает на http://yourserver/Home/RsvpForm . Метод Html.ActionLink проверил конфигурацию URL нашего приложения и определил, что /Home/RsvpForm является URL для действия RsvpForm контроллера HomeController . Обратите внимание, что в отличие от традиционных приложений ASP.NET, URL-адреса MVC не соответствуют физическим файлам. Каждый метод действия имеет свой URL, и MVC использует систему маршрутизации ASP.NET перевести эти URL в действия.

Создание метода действия

Если вы нажмете на ссылку, то увидите ошибку 404 Not Found . Это потому что пока еще мы не создали метод действия, который соответствует URL /Home/RsvpForm . Мы сделаем это путем добавления метода RsvpForm нашему классу HomeController , как показано в .

Листинг 2-10: Добавление в контроллер нового метода действия
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace PartyInvites.Controllers { public class HomeController: Controller { public ViewResult Index() { int hour = DateTime.Now.Hour; ViewBag.Greeting = hour < 12 ? "Good Morning" : "Good Afternoon"; return View(); } public ViewResult RsvpForm() { return View(); } } }

Добавление строго типизированного представления

Мы хотим добавить представление для нашего метода действия RsvpForm , но мы собираемся сделать кое-что больше: то есть создать строго типизированное представление. Строго типизированные представления предназначены для обработки определенного типа доменов. Если мы укажем тип, с которым мы хотим работать (в этом примере GuestResponse), MVC предоставит дополнительные возможности, чтобы упростить нам задачу.

Внимание

Убедитесь, что перед работой ваш MVC проект скомпилирован. Если вы создали класс GuestResponse , но не скомпилировали его, MVC не сможет создать строго типизированное представление для данного типа. Чтобы скомпилировать приложение, выберите Build Solution в Visual Studio меню Build .

Щелкните правой кнопкой мыши внутри метода действия RsvpForm и выберите для создания представления Add View из всплывающего меню. В диалоговом окне Add View поставьте галочку на Create a strongly-typed view и выберите опцию GuestResponse из выпадающего меню. Снимите флажок с Use a layout or master page и убедитесь, что Razor выбран в качестве движка представления, и что опция Scaffold template установлена на Empty , как показано на .

Рисунок 2-14: Добавление строго типизированного представления

Нажмите кнопку Add , и Visual Studio создаст новый файл с именем RvspForm.cshtml и откроет его для редактирования. Вы можете увидеть первоначальное содержание в. Как вы заметили, это другой HTML файл, но он содержит Razor выражение @model . Вы сейчас увидите, что это является ключом к строго типизированному представлению и возможностям, которые оно предлагает.

Листинг 2-12: Начальное содержимое файла RsvpForm.cshtml
@model PartyInvites.Models.GuestResponse @{ Layout = null; } RsvpForm

Построение формы

Теперь, когда мы создали строго типизированное представление, мы можем выстроить содержание RsvpForm.cshtml , чтобы превратить его в HTML форму для редактирования GuestResponse объектов. Измените представление так, чтобы оно соответствовало .

Листинг 2-13: Создание представления формы
RsvpForm @using (Html.BeginForm()) {

Your name: @Html.TextBoxFor(x => x.Name)

Your email: @Html.TextBoxFor(x => x.Email)

Your phone: @Html.TextBoxFor(x => x.Phone)

Will you attend? @Html.DropDownListFor(x => x.WillAttend, new { new SelectListItem() {Text = "Yes, I"ll be there", Value = bool.TrueString}, new SelectListItem() {Text = "No, I can"t come", Value = bool.FalseString} }, "Choose an option")

}

Для каждого свойства класса модели GuestResponse мы используем вспомогательный метод HTML, чтобы обработать подходящий HTML элемент управления input . Эти методы позволяют выбрать свойство, к которому относится элемент input , с помощью лямбда-выражения, например вот так:

@Html.TextBoxFor(x => x.Phone)

Вспомогательный метод HTML TextBoxFor генерирует HTML для элемента input , устанавливает параметр type на text и устанавливает атрибуты id и name на Phone , имя выбранного свойства доменного класса, вот так:

Эта удобная функция работает, потому что наше представление RsvpForm строго типизировано, и мы сказали MVC, что GuestResponse это тот тип, который мы хотим обработать при помощи данного представления, поэтому вспомогательные методы HTML могут понять, какой тип данных мы хотим прочитать, с помощью выражения @model .

Не волнуйтесь, если вы не знакомы с лямбда-выражениями C#. Мы расскажем о них в главе 4, но в качестве альтернативы лямбда-выражениям вы можете обратиться к имени свойства типа модели как к строке, например, вот так:

@Html.TextBox("Email")

Мы считаем, что методика лямбда-выражений помогает нам не делать опечаток в имени свойства типа модели, потому что всплывает Visual Studio IntelliSense и позволяет нам выбрать свойство автоматически, как показано на .

Рисунок 2-15: Visual Studio IntelliSense для лямбда-выражений во вспомогательных методах HTML

Другим удобным вспомогательным методом является Html.BeginForm , который генерирует элемент HTML формы, настроенный на обратную передачу данных методу действия. Поскольку мы не передали вспомогательному методу никаких параметров, он предполагает, что мы хотим передать обратно тот же URL. Ловким трюком является то, чтобы обернуть это в C# выражение using , вот таким образом:

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

Вместо удаления объекта, помощник HtmlBeginForm закрывает HTML элемент form , когда он выходит из области видимости. Это означает, что вспомогательный метод Html.BeginForm создает обе части элемента form , например:

Не волнуйтесь, если вы не знакомы с удалением объектов в C#. Наша цель на данный момент состоит в том, чтобы показать, как создать форму с помощью вспомогательного метода HTML. Вы можете видеть форму в представлении RsvpForm , когда вы запустите приложение и нажмете ссылку RSVP Now . На показан результат.

Рисунок 2-16: Представление RspvForm

Примечание

Это не книга о CSS или веб дизайне. По большей части мы будем создавать примеры, внешний вид которых может быть описан как устаревший (хотя мы предпочитаем термин классический , в котором чувствует меньше пренебрежения). MVC представления генерируют очень чистый и простой HTML, и вы можете полностью управлять версткой элементов и классов, к которым они принадлежат, поэтому у вас не будет проблем с использованием дизайнерских средств или готовых шаблонов, чтобы сделать ваш MVC проект красивым.

Обработка форм

Мы не сказали MVC, что мы хотим сделать, когда форма отправляется на сервер. На данный момент нажатие на кнопку Submit RSVP просто удаляет любые значения, которые вы ввели в форму. Это потому что форма отправляется обратно методу действия RsvpForm в контроллере Home , который просто говорит MVC обработать представление еще раз.

Примечание

Вы можете быть удивлены тем фактом, что входные данные теряются, когда представление снова обрабатывается. Если это так, то вы, вероятно, разрабатывали приложения при помощи ASP.NET Web Forms, который автоматически сохраняет данные в этой ситуации. Мы покажем вам, как добиться такого же результата с MVC в ближайшее время.

Чтобы получить и обработать отправленные данные формы, мы собираемся сделать умную и классную вещь. Мы добавим второй метод действия RsvpForm для того, чтобы создать следующее:

  • Метод, который отвечает на HTTP GET запросы : GET запрос является тем, с чем браузер имеет дело после каждого клика по ссылке. Этот вариант действий будет отвечать за отображение начальной пустой формы, когда кто-то первый раз посетит /Home/RsvpForm .
  • Метод, который отвечает на HTTP POST запросы : По умолчанию, формы, обрабатываемые при помощи Html.BeginForm() , отправляются браузером как POST запросы. Этот вариант действий будет отвечать за получение отправленных данные и решать, что с ними делать.

Обработка GET и POST запросов в отдельных методах C# помогает сохранить наш код опрятным, так как оба метода имеют различные обязанности. Оба метода действия вызываются одним и тем же URL, но MVC гарантирует, что будет вызван соответствующий метод в зависимости от того, имеем ли мы дело с GET или с POST запросом. В показаны изменения, которые мы должны сделать в классе HomeController .

Листинг 2-14: Добавление метода действия для поддержки POST запросов
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using PartyInvites.Models; namespace PartyInvites.Controllers { public class HomeController: Controller { public ViewResult Index() { int hour = DateTime.Now.Hour; ViewBag.Greeting = hour < 12 ? "Good Morning" : "Good Afternoon"; return View(); } public ViewResult RsvpForm() { return View(); } public ViewResult RsvpForm(GuestResponse guestResponse) { // TODO: Email response to the party organizer return View("Thanks", guestResponse); } } }

Мы добавили атрибут HttpGet для нашего существующего метода действия RsvpForm . Это говорит MVC, что данный метод должен использоваться только для GET запросов. Затем мы добавили перегруженную версию RsvpForm , который принимает параметр GuestResponse и применяет атрибут HttpPost . Атрибут говорит MVC, что новый метод будет иметь дело с POST запросами. Обратите внимание, что мы также импортировали пространство имен PartyInvites.Models – таким образом мы можем обратиться к типу модели GuestResponse без необходимости указывать имя класса. Мы расскажем, как работают наши дополнения в листинге, в следующих разделах.

Использование связывания данных модели

Первый вариант перегруженного метода действия RsvpForm обрабатывает то же представление, что и раньше. Она генерирует форму, показанную на . Второй вариант перегруженного метода является более интересным из-за параметра, но, учитывая, что метод действия будет вызываться в ответ на HTTP POST запрос, и что GuestResponse является типом класса C #, то как они объединены?

Ответом является связывание данных модели – чрезвычайно полезная функциональная особенность MVC, когда входные данные разбиваются (парсятся) и пары ключ/значение в HTTP запросе используются для заполнения свойств типа доменной модели. Этот процесс является противоположностью использования вспомогательных методов HTML; это когда при создании данных формы для отправки клиенту, мы генерировали HTML элементы input , где значения атрибутов id и name были получены из названий свойств классов моделей.

В отличие от этого, со связыванием данных модели, имена элементов input используются для указания значений свойств в экземпляре класса модели, которые затем передаются нашему методу действия с POST поддержкой.

Модель представления данных является мощной и настраиваемой функцией, которая избавляет от рутины работы напрямую с HTTP-запросами и позволяет нам работать с C# объектами, а не иметь дело со значениями Request.Form и Request.QueryString . Объект GuestResponse , который передается в качестве параметра нашему методу действия, автоматически заполняется данными из полей формы. Мы рассмотрим подробно модель представления данных, а также в том числе, как ее можно настроить, в главе 22.

Обработка других представлений

Второй вариант перегруженного метода действий RsvpForm также показывает, как мы можем указать MVC обрабатывать конкретное представление, а не представление по умолчанию, в ответ на запрос. Вот соответствующее выражение:

return View("Thanks", guestResponse);

Этот вызов метода View говорит MVC найти и обработать представление, которое называется Thanks , и передать представлению наш объект GuestResponse . Чтобы создать представление, которое мы указали, щелкните правой кнопкой мыши внутри одного из методов HomeController и выберите пункт Add View из всплывающего меню. Установите имя представления на Thanks , как показано на .

Рисунок 2-17: Добавление представления Thanks

Мы собираемся создать еще одно строго типизированное представление, поэтому поставьте галочку на этом пункте в диалоговом окне Add View . Класс данных, который мы выберем для этого представления, должен соответствовать классу, который мы передали представлению при помощи метода View . Поэтому убедитесь, что в выпадающем меню выбран GuestResponse . Убедитесь, что нет галочки на Use a layout or master page , View engine установлен на Razor, а также Scaffold template установлен на Empty .

Нажмите кнопку Add , чтобы создать новое представление. Поскольку представление связано с контроллером Home , MVC создаст представление как ~/Views/Home/Thanks.cshtml . Измените новое представление так, чтобы оно соответствовало : мы выделили то, что нужно добавить.

Листинг 2-15: Представление Thanks
@model PartyInvites.Models.GuestResponse @{ Layout = null; } Thanks

Thank you, @Model.Name!

@if (Model.WillAttend == true) { @:It"s great that you"re coming. The drinks are already in the fridge! } else { @:Sorry to hear that you can"t make it, but thanks for letting us know. }

Представление Thanks использует Razor для отображения контента на основе значения свойства GuestResponse , которые мы передали методу View в методе действия RsvpForm . Razor оператор @model определяет тип доменной модели, с которым связано представление. Чтобы получить доступ к значению свойства доменного объекта, мы используем Model.PropertyName . Например, чтобы получить значение свойства Name , мы вызываем Model.Name . Не волнуйтесь, если вам не понятен синтаксис Razor, мы объясним это подробно в главе 5.

Теперь, когда мы создали представление Thanks , у нас есть базовый рабочий пример обработки формы при помощи MVC.

Запустите приложение в Visual Studio, нажмите на ссылку RSVP Now , добавьте в форму данные и нажмите на кнопку Submit RSVP . Вы увидите результат, показанный на (хотя он может отличаться, если ваше имя не Джо, и вы сказали, что не сможете присутствовать).

Рисунок 2-18: Обработанное представление Thanks

Добавление валидации

Сейчас мы подошли к тому, чтобы добавить валидацию в наше приложение. Если бы мы этого не сделаем, наши пользователи смогут ввести бессмысленные данные или даже отправить пустую форму.

В приложении MVC проверка, как правило, применяется к доменной модели, а не к пользовательскому интерфейсу. Это обозначает, что мы определяем наши критерии валидации в одном месте, и они вступают в силу в любом месте используемого класса модели. ASP.NET MVC поддерживает правила проверки, определяемые атрибутами пространства имен System.ComponentModel.DataAnnotations . В показано, как эти атрибуты могут быть применены к классу модели GuestResponse .

Листинг 2-16: Применение валидации к классу модели GuestResponse
using System.ComponentModel.DataAnnotations; namespace PartyInvites.Models { public class GuestResponse { public string Name { get; set; } public string Email { get; set; } public string Phone { get; set; } public bool? WillAttend { get; set; } } }

Правила валидации выделены жирным шрифтом. MVC автоматически обнаруживает атрибуты и использует их для проверки данных во время представления модели данных. Обратите внимание, что мы импортировали пространство имен, содержащее правила валидации, поэтому мы можем ссылаться на них без необходимости указывать их имена.

Совет

Как отмечалось ранее, мы использовали тип bool? для свойства WillAttend , поэтому мы смогли применить атрибут валидации Required . Если бы мы использовали обычный bool , значение, которое мы могли бы получить благодаря модели представления данных, могло бы быть только true или false , и мы не были бы сказать, выбрал ли пользователь значение. Тип bool? имеет три возможных значения: true , false и null . Значение null будет использовано, если пользователь не выбрал значение, и это заставляет атрибут Required сообщить об ошибке валидации.

Мы можем проверить, была ли ошибка валидации проверкой с помощью свойства ModelState.IsValid в нашем классе контроллера. В показано, как это можно сделать в нашем методе действия RsvpForm с поддержкой POST .

Листинг 2-17: Проверка на наличие ошибок при валидации формы
public ViewResult RsvpForm(GuestResponse guestResponse) { if (ModelState.IsValid) { // TODO: Email response to the party organizer return View("Thanks", guestResponse); } else { // there is a validation error return View(); } }

Если ошибки валидации нет, мы говорим MVC обрабатывать представление Thanks , как мы делали ранее. Если ошибка валидации есть, мы вновь обрабатываем представление RsvpForm , вызвав метод View без параметров.

Просто отображать форму, когда есть ошибка, не очень полезно, мы должны дать пользователю некоторую информацию о том, в чем заключается проблема, и почему мы не можем принять его форму. Мы делаем это с помощью вспомогательного метода Html.ValidationSummary в представлении RsvpForm , как показано в .

Листинг 2-18: Использование вспомогательного метода Html.ValidationSummary
@model PartyInvites.Models.GuestResponse @{ Layout = null; } RsvpForm @using (Html.BeginForm()) { @Html.ValidationSummary()

Your name: @Html.TextBoxFor(x => x.Name)

Your email: @Html.TextBoxFor(x => x.Email)

Your phone: @Html.TextBoxFor(x => x.Phone)

Will you attend? @Html.DropDownListFor(x =>

}

Если ошибок нет, метод Html.ValidationSummary создает скрытый элемент списка в качестве заполнителя в форме. MVC делает метку-заполнитель видимой и добавляет сообщения об ошибке, определяемые атрибутами валидации. Вы можете увидеть, как это выглядит, на .

Рисунок 2-19: Сводка результатов валидации

Пользователю не будет показано представление Thanks , пока не будут удовлетворены все правила валидации, которые мы применили к классу GuestResponse . Обратите внимание, что данные, введенные в форму, были сохранены и отображаются снова, когда представление показано со сводкой валидации. Это еще одно преимущество связывания данных.

Примечание

Если вы работали с ASP.NET Web Forms, вы знаете, что в Web Forms существует понятие «серверные элементы управления», которые сохраняют состояние, сериализуя значения в скрытом поле формы __VIEWSTATE . Связывание данных ASP.NET MVC не привязано к Web Forms концепции серверных элементов управления, обратной передачи данных или View State. ASP.NET MVC не вводит скрытое поле __VIEWSTATE в обрабатываемые HTML страницы.

Выделение невалидных полей

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

Если свойство класса модели не прошло валидацию, вспомогательные методы HTML будут генерировать немного другой HTML. В качестве примера, вот HTML, который генерирует вызов Html.TextBoxFor (х => x.Name) , когда нет ошибки валидации:

А вот HTML, который генерирует тот же вызов, когда пользователь не предоставил значение (что является ошибкой валидации, потому что мы применили атрибут Required свойства Name в классе модели GuestResponse):

class="input-validation-error" data-val="true" data-val-required="Please enter your name" id="Name" name="Name" type="text" value="" />

Мы выделили различия. Это вспомогательный метод добавил класс с именем input-validation-error . Мы можем воспользоваться этой функцией, создав таблицу стилей CSS, которая содержит стили для этого класса и других, что применяют различные вспомогательные методы HTML.

Соглашение в MVC проектах заключается в том, что статический контент, такой как таблицы стилей CSS, помещается в папку под названием Content . Мы создали папку Content , нажав правой кнопкой мыши по проекту PartyInvites в Solution Explorer и выбрав из всплывающего меню Add New Folder . Мы создали таблицу стилей, щелкнув правой кнопкой мыши по папке Content , выбрав Add New Item и затем выбрав Style Sheet в диалоговом окне Add New Item . Мы назвали нашу таблицу стилей Site.css , и это имя, которое Visual Studio использует при создании проекта с использованием иного шаблона MVC, а не Empty. Вы можете посмотреть содержимое файла Content/Site.css в.

Листинг 2-19: Содержимое файла Content/Site.css
.field-validation-error {color: #f00;} .field-validation-valid { display: none;} .input-validation-error { border: 1px solid #f00; background-color: #fee; } .validation-summary-errors { font-weight: bold; color: #f00;} .validation-summary-valid { display: none;}

Чтобы использовать эту таблицу стилей, мы добавили новую ссылку в раздел head представления RsvpForm , как показано в . Вы добавляете представлениям элементы link так же, как в обычном статическом HTML файле.

Листинг 2-20: Добавление элемента link в представление RsvpForm
@model PartyInvites.Models.GuestResponse @{ Layout = null; } RsvpForm @using (Html.BeginForm()) { @Html.ValidationSummary()

Your name: @Html.TextBoxFor(x => x.Name)

Your email: @Html.TextBoxFor(x => x.Email)

Your phone: @Html.TextBoxFor(x => x.Phone)

Will you attend? @Html.DropDownListFor(x => x.WillAttend, new { new SelectListItem() {Text = "Yes, I"ll be there", Value = bool.TrueString}, new SelectListItem() {Text = "No, I can"t come", Value = bool.FalseString} }, "Choose an option")

}

Совет

Если вы использовали MVC 3, то могли ожидать, чтобы мы добавим CSS файл к представлению, указав атрибут href как @Href("~/Content/Site.css") или @Url.Content("~/Content/Site.css") . С MVC 4 Razor автоматически обнаруживает атрибуты, которые начинаются с ~/ , и автоматически вставляет для вас @Href или @Url .

Теперь будет отображаться визуально более очевидная ошибка валидации, если были представлены данные, которые вызвали эту ошибку, как показано на .

Рисунок 2-20: Автоматически выделенные ошибки валидации

Завершаем пример

Последнее требование к нашему примеру приложения заключается в том, чтобы отправить имейл с завершенными RSVP нашему другу, организатору вечеринки. Мы могли бы сделать это, добавив метод действия, чтобы создать и отправить по электронной почте сообщение, используя e-mail классы.NET Framework. Вместо этого мы собираемся использовать вспомогательный метод WebMail . Это не входит в рамки MVC, но это позволит нам завершить данный пример, не увязнув в деталях создания других средств отправки электронной почты.

Примечание

Мы использовали вспомогательный метод WebMail , потому что он позволяет нам с минимальными усилиями продемонстрировать отправку сообщений электронной почты. Однако, в обычной ситуации мы предпочли бы переложить эту функцию на метод действия. Мы объясним, почему, когда будем описывать архитектурный MVC паттерн в главе 3.

Мы хотим, чтобы имейл сообщение было отправлено, когда мы обрабатываем представление Thanks . В показаны изменения, которые мы должны сделать.

Листинг 2-21: Использование вспомогательного метода WebMail
@model PartyInvites.Models.GuestResponse @{ Layout = null; } Thanks @{ try { WebMail.SmtpServer = "smtp.example.com"; WebMail.SmtpPort = 587; WebMail.EnableSsl = true; WebMail.UserName = "mySmtpUsername"; WebMail.Password = "mySmtpPassword"; WebMail.From = "[email protected]"; WebMail.Send("[email protected]", "RSVP Notification", Model.Name + " is " + ((Model.WillAttend ?? false) ? "" : "not") + "attending"); } catch (Exception) { @:Sorry - we couldn"t send the email to confirm your RSVP. } }

Thank you, @Model.Name!

@if (Model.WillAttend == true) { @:It"s great that you"re coming. The drinks are already in the fridge! } else { @:Sorry to hear that you can"t make it, but thanks for letting us know. }

Мы добавили Razor выражение, которое использует вспомогательный метод WebMail для настройки информации о нашем сервере электронной почты, включая имя сервера, требует ли сервер SSL соединения и данных учетной записи. После того как мы все настроили, мы используем метод WebMail.Send для отправки электронной почты.

Мы включили весь имейл код в блок try...catch , чтобы мы могли предупредить пользователя, если электронная почта не отправилась. Мы делаем это путем добавления текстового блока к выходным данным представления Thanks . Лучше было бы отобразить отдельное представление ошибки, если сообщение электронной почты не может быть отправлено, но мы хотели не усложнять наше первое MVC приложение.

Many Web sites include content that is available only to people who have logged in (that is, who have been authenticated). By default, ASP.NET provides Web site project templates that include pages that let you perform authentication tasks.

The ASP.NET Web project template that is illustrated in this walkthrough is new in Visual Studio 2010.

This walkthrough shows you how to use an ASP.NET Web project template to create a Web site with basic login functionality.

Tasks illustrated in this walkthrough include:

    Creating an ASP.NET Web site.

    Creating a members-only page. The page will be accessible only to authenticated users (users who are logged in).

    Using the registration page, which enables users to register and create a new account.

    Logging in and accessing information that is available only to authenticated users.

    Using the change-password page, which enables users who have an account to change their password.

    Making the change-password page accessible to authenticated users (but only to authenticated users).

Prerequisites

In order to complete this walkthrough, you will need:

    Microsoft Visual Web Developer 2010 Express or Visual Studio 2010.

    SQL Server Express installed locally on your computer. For information about how to install SQL Server Express, see How to: Connect to the AdventureWorksLT Database using an .MDF File .

Creating a New Web Site Project

You will start by creating a new ASP.NET Web site project. The project template that you use includes many of the elements that are required in order to create a site that supports authentication.

This walkthrough uses a Web site project. You could use a Web application project instead. For information about the difference between these Web project types, see Web Application Projects versus Web Site Projects .

To create a new ASP.NET Web site

    Start Visual Studio or Visual Web Developer.

    In the File menu, click New Web Site . (If you do not see this option, click New , and then click Web Site .)

    The New Web Site dialog box is displayed.

    Under Installed Templates , click Visual Basic or C# and then select ASP.NET Web Site .

    In the Web Location box, select File System and enter the name of the folder where you want to keep the pages of the Web site. For example, enter the folder name C:\Websites\Login and then click OK .

    Visual Studio creates the folder and opens the Web site in Source view. Notice that the root Web site contains several files and folders including the Account folder, a Web.config file, the About.aspx and Default.aspx pages, and the Site.master master page.

    The home of page of the Web site is displayed in the browser. Notice the menu items (Home , About ) and the Log In hyperlink.

    Close the browser.

Creating a Members Only Page

In this section, you will create a members-only page. Only users who are logged in (authenticated users) can access this page. You will add a control to the master page to redirect authenticated users to the members-only page. When users who are not logged in (anonymous users) click the members-only hyperlink, they will be redirected to the login page where they can login or create an account.

To create the members only page

    In Solution Explorer , right click the Account folder and then click Add New Item .

    Make sure that you are creating the new page in the Account folder.

    In the New Web Sites dialog box, select Web Form .

    In the Name text box, enter MembersOnly.aspx.

    Select the Select master page check box and then click Add .

    The Select a Master Page dialog box is displayed.

    Under Contents of folders , select Site.master and then click OK .

    The MembersOnly.aspx page is created in the Account folder. The page is a content page for the Site.master page.

    In Solution Explorer , double-click the MemberOnly.aspx page to open it, and then switch to Design view.

    Add content to the main page.

    For example, you can add "Welcome to the members-only page. You have successfully logged in."

In addition to the page that you have created, the Account folder contains the following pages and files:

    Register.aspx. This page lets new users create an account.

    Login.aspx page. This asks for a user name and password.

    ChangePassword.aspx. This page lets registered users change their password.

    ChangePasswordSuccess.aspx. This page is displayed when users successfully change their password.

    A Web.config file.

By default, pages in the Account folder are not accessible to anonymous users, except the Register.aspx and the Login.aspx pages. The settings that define access to pages in the Account folder are configured in the Web.config file in that folder. The settings that define access to the Login page is configured in the root Web.config file.

In the Properties windows, change the Text property to Change Password. You can accept the default ID.

In the Properties window, click NavigateUrl and click the ellipsis (... ) button.

The Select URL dialog box is displayed.

Under Project folders , click Account .

Under Contents of folder OK .

Press CTRL+F5 to run the page.

Notice that the Change Password link is accessible when you are not logged in.

Click Change Password .

You are redirected to the login page because the change-password page is accessible to authenticated users only.

Enter the user name and password that you created earlier, and then click Log In .

Click Log Out .

When you are returned to the home page, close the browser.

Next, you will modify the Change Password hyperlink to make it accessible only to users are logged in. You do this by adding the hyperlink to the HeadLoginView control on the master page.

To make the change-password link available only to logged-in users

    In Solution Explorer , double-click Site.master.aspx to open it, and then switch to Design view.

    Delete the Change Password hyperlink that you created earlier.

    Switch to Source view.

    From the Standard node of the Toolbox , drag a control into the LoggedInTemplate element that is inside the LoginView control.

    Set the Text property to Change Password.

    After the runat="server" attribute, type "NavigateUrl=" and then double-click Pick URL… from the pop-up list.

    The Select Project Item dialog box is displayed.

    Under Project folders , click Account .

    Under Contents folder , select ChangePassword.aspx and then click OK .

    The markup for the hyperlink will resemble the following:

    Change Password

    Note that this hyperlink will not be visible in Design view, because the contents of the LoggedInTemplate element are not visible by default.

Testing the Web Site

You can now test the change-password functionality of the Web site.

To test the change password page

    Press CTRL+F5 to run the site.

    The home page is displayed, but the Change your password link is not visible.

    Click Log In and enter your user name and password.

    You are redirected to the home page. Notice that your name and the Change your password link are now visible.

    Click Members Only.

    You are redirected to the members-only page.

    Click Change your password .

    The change-password page is displayed.

    Enter a new password.

    Click Change Password . If the change is successful, the success page will be displayed.

Testing the New Password

Next you will use your new password to login again and access the members-only page.

To test the new password

    Click Log Out . You will be redirected to the home page that anonymous users see.

    Click Log In .

    Enter your user name and the new password and then click Log In .

    You are redirected to the home page. You can now access content that is available to authenticated users. .

    Click Members Only .

    You are redirected to the members-only page. If you try to login with your old password authentication will fail.

    Close the browser.

Next Steps

In this walkthrough, you used pages that are part of the ASP.NET Web site project template in order to create a Web site that authenticates users. If you prefer, you can also create your own login pages to provide the same functionality that is illustrated in the walkthrough. For more information, see .

Сегодня я хочу привести 10 веских причин, почему ASP.NET для начинающих подходит больше всего:

Если вы уже работаете с PHP или Java (или даже .NET ), или просто хотите понять, как создавать веб-приложения, то я бы рекомендовал вам задуматься об ASP.NET .

1. Отсутствие System.Web

Для нас, пользователей WebForm , без нее не обойтись при разработке веб-приложений. Если вы решитесь перейти к ASP.NET MVC Core 1.0 , то в нем исключено взаимодействие с библиотекой System.Web , что позволяет ускорить загрузку и работу сайта на базе ASP.NET .

2. Новая улучшенная модель 2016 года

ASP.NET MVC 4 для начинающих и ASP.NET MVC 5 канул в Лету… Некоторое время назад .NET был полностью переписан и переименован в ASP.NET Core 1.0 . Это еще больше облегчило жизнь разработчиков. Из привычного цикла, состоящего из написания кода, компиляции и тестирования работоспособности был исключен этап компиляции. Это значительно ускоряет процесс разработки.

3. Более естественные ощущения

Я был разработчиком в Microsoft еще со времен Classic ASP , и когда я перешел на WebForms , этот переход вовсе не показался мне естественным. С появлением MVC процесс разработки веб-приложений стал более натуральным, и такой формат работы мне понравился. В MVC нет ViewState или IsPostback , и о них не нужно постоянно беспокоиться. Все очень похоже на PHP .

4. Самый популярный в школе

Так как ASP.NET базируется на IIS – одном из самых популярных веб-серверов, то работа с MVC кажется вполне привычной. Большинство корпораций во времена Classic ASP начинали именно с IIS . На сегодняшний день IIS-серверы занимают 28% всего интернета и уступают по популярности только Apache и nginx .

5. Упрощенная интеграция с Javascript

В WebForms при попытке использовать Javascript могли возникнуть всевозможные проблемы, о которых многие из нас даже не подозревают. Мне доводилось видеть, как разработчики мучились с интеграцией JavaScript в код WebForm Page_Load ! В свою очередь, ASP.NET MVC для начинающих позволяет практически безукоризненно интегрировать Javascript в приложения. Просто попробуйте внедрить AngularJs в какое-нибудь веб-приложение на WebForms , а потом расскажите мне, сколько волос осталось на вашей голове.

6. Открытый исходный код

Теперь каждый может просматривать код! Если вы хотите дополнить View , и создать собственный ViewEngine , просто ознакомьтесь с кодом на Github , и посмотрите, как он реализован. Доступ к исходному коду развивает воображение!

7. Кроссплатформенная поддержка

Теперь можно создавать веб-приложения на любой платформе: Apple , Linux или Windows .

8. Независимость от Visual Studio

Чуть ли не с момента первого упоминания о выходе обновленного .NET/ASP.NET , всевозможные разработчики (включая Microsoft ) занялись созданием собственных IDE , которые раскрывают возможности новой версии .NET . Такие IDE (Visual Studio Code или Rider на #C от JetBrains) позволяют разрабатывать собственные ASP.NET и C# проекты без Visual Studio . Теперь не так важно, какую среду использует разработчик, ведь клиентам просто нужен готовый сайт!

9. Адекватное сообщество

ASP.NET MVC для начинающих и для большинства веб-разработчиков как глоток свежего воздуха. Этот инструмент переносит нас в новую эру, далекую от WebForms . Значительная часть разработчиков уже перешла на MVC .

10. Модульное тестирование

Кроме этого ASP.NET MVC предоставляет возможность модульного тестирования. Это в значительной степени облегчает процесс тестирования. Для некоторых разработчиков WebForm это покажется принципиально новым концептом, так как до этого тестирование некоторых интерфейсов и бизнес-компонентов создавало огромные проблемы. В ASP.NET MVC можно без труда протестировать все компоненты и убедиться в полной работоспособности приложения.

В завершение

Надеюсь, что сегодня вы получили достаточно информации о качествах ASP.NET MVC , ради которых стоит перейти на этот инструмент.

Перевод статьи “10 Reasons To Start Using ASP.NET MVC ” был подготовлен дружной командой проекта .

Хорошо Плохо

Последнее обновление: 31.10.2015

ASP.NET MVC представляет собой платформу для создания сайтов и веб-приложений с использованием паттерна (или шаблона) MVC (model - view - controller).

Работа над новой платформой была начата в 2007 году, а в 2009 году появилась первая версия. В итоге к текущему моменту (2012 год) уже было выпущено 4 версии платформы, а сам фреймворк обрел большую популярность по всему миру благодаря своей гибкости и адаптивности.

Шаблон MVC, лежащий в основе новой платформы, подразумевает взаимодействие трех компонентов: контроллера (controller), модели (model) и представления (view). Что же представляют эти компоненты?

Контроллер (controller) представляет класс, с которого собственно и начинается работа приложения. Этот класс обеспечивает связь между моделью и представлением. Получая вводимые пользователем данные, контроллер исходя из внутренней логики при необходимости обращается к модели и генерирует соответствующее представление.

Представление (view) - это собственно визуальная часть или пользовательский интерфейс приложения - например, html-страница, через которую пользователь, зашедший на сайт, взаимодействует с веб-приложением.

Модель (model) представляет набор классов, описывающих логику используемых данных.

Общую схему взаимодействия упрощенно можно представить следующим образом:

ASP.NET MVC и ASP.NET Web Forms

ASP.NET MVC является в некотором роде конкурентом для традиционных веб-форм и имеет по сравнению с ними следующие преимущества:

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

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

    Соответствие протоколу HTTP . Приложения MVC в отличие от веб-форм не поддерживают объекты состояния (ViewState). Ясность и простота платформы позволяют добиться большего контроля над работой приложения

    Гибкость . Вы можете настраивать различные компоненты платформы по своему усмотрению. Изменять какие-либо части конвейера работы MVC или адаптировать его к своим нуждам и потребностям.

В то же время не стоит однозначно сбрасывать со счетов ASP.NET WebForms. Поскольку она также имеет свои сильные стороны, например, модель событий, которая будет ближе тем разработчикам, которые ранее занимались созданием клиентских приложений.

В традиционных веб-формах вы имеете контроль над разметкой и можете в реальном времени в визуальном редакторе Visual Studio увидеть, как будет выглядеть та или иная страница. При работе с MVC Visual Studio подобного не позволяет делать.

В любом случае вы вольны выбирать ту платформу, которая приходится вам больше по душе. И если у вас написаны объемные проекты с применением традиционных веб-форм, возможно, стоит продолжать с ними работать. Тем более, что ASP.NET Web Forms еще не умирает и также продолжает развиваться.