Предыдущий ролик Следующий ролик  

Видео урок: Applying action selectors

Основы ASP.NET MVC 5

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

Причина, по которой необходимо обозначить, что этот метод является post-методом, заключается в том, что мы планируем использовать еще один метод с таким же названием, который будет реагировать на запросы Get. Нам нужно, чтобы пользователи могли запрашивать действие Create и в ответ им предоставлялась пустая форма. Это будет достигаться за счет того, что данное действие возвращает представление Create. Тем не менее на практике обычно не приходится явно указывать, какие действия являются get-действиями. Если мы создадим отдельную post-версию метода, то движок маршрутизации проигнорирует ее в случае выполнения запроса Get для действия Create, и выберет тот метод, который не отмечен селектором действия HTTP-операции.

Если в том приложении, которое мы создали в начале данной главы, перейти по адресу /home/contact или просто нажать на ссылку "Contact" (Контактная информация), то мы получим статическую страницу с адресом, номером телефона и несколькими адресами электронной почты. Сюда я хочу добавить очень простую контактную форму, поэтому давайте в разделе Views -> Home откроем представление Contact и добавим сюда форму, с помощью которой пользователи смогут отправить нам сообщение. Обеспечим, чтобы параметр метода form имел значение "post" и по умолчанию просто направлял на текущий URL.

Также добавим текстовую область под названием "message", а затем кнопку "submit". Теперь давайте рассмотрим метод contact класса HomeController. Если вы похожи на меня, то это присваивание, ViewBag.Message, скорее всего, вас обеспокоит, потому что до настоящего момента я о нем ничего не рассказывал. ViewBag - это динамический объект, который мы используем для обмена информацией между контроллером и представлением и который не содержится в модели, поскольку на самом деле не относится к данным о приложении. Он чем-то напоминает объект session, за исключением того, что показывается он при отображении вашего представления и доступен только в том случае, если в конце метода вы возвращаете View.

Если вы переключитесь на другое действие или сделаете нечто подобное, то увидите, что все заданные вами свойства ViewBag больше недоступны. Если вам нужно, чтобы какое-то свойство было доступно после перенаправления, можете воспользоваться словарем TempData и присвоить значение ключу Message подобным образом. Но поскольку ViewBag - это динамический объект, я могу добавить в это представление свойства, вместо того чтобы использовать строковые ключи. Например, можно заменить "Message" на "TheMessage" и сделать это сообщение более полезным. Например: "Столкнулись с проблемой? - Отправьте нам письмо". Давайте снова вернемся к представлению Contact.

Вот здесь показывается ViewBag.Message, и не забывайте, что мы только что заменили его на "TheMessage". Давайте расположим его прямо над формой. Теперь вернемся к HomeController и создадим еще один метод contact, для которого используется селектор действия HttpPost. Этот метод принимает строковый параметр под названием "message", его название обязательно должно совпадать с названием текстовой области, которую мы добавили на форму.

Добавим комментарий, поясняющий, что на самом деле нужно сделать с сообщением. И теперь просто поменяем значение параметра на "Thanks. We got your message." (Спасибо. Мы получили ваше сообщение). Затем добавим несколько точек останова в первые строки этих методов и запустим сеанс отладки по клавише F5, который мы также сохраним и построим. Если я теперь нажму на ссылку "Contact", то как увидите, попаду внутрь нашего первоначального метода contact. Нажмем клавишу F5, чтобы продолжить отладку. После заполнения и отправки формы я попадаю в другой метод, отмеченный атрибутом HttpPost. Если навести курсор на параметр message, то можно увидеть, что мы ввели в форму. Это делает процесс обработки более удобным.

Снова нажимаем F5 и видим сообщение об успехе, которое отображается в представлении. Есть еще атрибут ActionName, благодаря которому метод можно вызывать с помощью дополнительного имени. Например, представим, что вам не нравится название "About" и вы хотите использовать имя, в котором содержится дефис. В именах методов запрещено использовать дефис, но эту проблему можно обойти, воспользовавшись атрибутом ActionName. К сожалению, это также приведет к тому, что движок представлений будет искать файл представления, имя которого совпадает с данной строкой. Поэтому нужно в методе View дать ему подсказку, что мы все равно ищем представление About.

Последнее, что хотелось бы сказать по поводу селекторов действий. В MVC5 теперь можно настраивать маршруты не в файле RouteConfig, а с помощью атрибутов отдельных действий. Лично я все равно предпочитаю пользоваться традиционным способом, но у вас есть возможность применять оба способа в рамках одного и того же проекта. Поэтому если вас интересует такой способ, введите в поисковике Google запрос "маршрутизация с помощью атрибутов". Итак, мы посмотрели, как можно добавлять в методы некоторые ограничения и функции с помощью селекторов действий в форме таких простых атрибутов.