ASP.NET MVC 4 в действии

ASP.NET MVC 4 в действии

Джеффри Палермо

Управление ссылками и URL-адресами с помощью T4MVC

ASP.NET MVC содержит множество возможностей, чтобы не попасть впросак с "магическими строками", особенно с генерацией URL. "Магические строки" – это строковые константы, которые используются для представления других конструкций, но с добавлением разъединением, что может привести к неявным ошибкам, которые появляются только во время выполнения. Например, многие ASP.NET MVC методы принимают строковые параметры, которые ссылаются на классы контроллеров и методы действий. Переименование контроллера или действия не приводит к обновлению этих строк, что приводит к прерыванию работы приложения во время выполнения.

T4MVC проект содействует процессу обеспечения некоторой логики при обращении к контроллерам, представлениям и действиям посредством генерации иерархической модели представления кода, которая используется в рамках контроллеров и представлений. T4MVC проект использует движок шаблонизации T4 компании Microsoft для того, чтобы обеспечить упрощенный способ обращения к контроллерам, действиям и представлениям.

В следующем листинге наше действие Edit содержит вызов метода BeginForm, который обращается к действию Save контроллера Profile, используя "волшебные строки" для создания URL для элемента формы.

Листинг 13-8: Хрупкое представление Edit с "магическими строками"
@using (Html.BeginForm("Save", "Profile"))
{
	@Html.EditorForModel()
	<p>
		<input type="submit" value="Save" name="SaveButton" />
	</p>
}

"Магические строки" листинга 13-8 располагаются в методе Html.BeginForm. Строки "Save" и "Profile" – это данные роута, которые обращаются к классу ProfileController и методу Save. Если бы мы изменили название нашего контроллера и действия с помощью встроенных инструментов рефакторинга, то наше представление Edit было бы разрушено. В идеале все места, в которых мы обращаемся к контроллерам, действиям, представлениям и значениям роута посредством "магических строк" можно было бы переместить при помощи чего-то более устойчивого к неизбежным изменениям в большинстве проектов. В предыдущем разделе мы видели указатель "area" на жестко-закодированные значения данных роута. Если бы мы случайно неправильно напечатали или сделали орфографическую ошибку при задании содержимого или значений области роута, то наше приложение прервало бы свою работы во время выполнения.

Для исключения этих потенциальных проблем у нас есть две возможности. Мы можем использовать константы и строго типизированные генерации URL, основанные на выражениях, или мы можем использовать форму генерации кода, которая дает нам возможность легко обращаться к представлениям, контроллерам или действиям. T4MVC проект, который является частью MvcContrib (http://mvccontrib.org), использует T4 (Text Template Transformation Toolkit) шаблоны для генерации методов расширений, констант наименований представлений и вспомогательных ссылок для того, чтобы исключить надоедливые "магические строки", которые, в противном случае, засорили бы наше приложение. T4MVC шаблоны используют технологию шаблонизации T4, введенную в Visual Studio 2008.

Для того чтобы использовать T4MVC вам для начала нужно загрузить последний релиз T4MVC с сайта http://mvccontrib.codeplex.com/wikipage?title=T4MVC и поместить в корневую папку вашего приложения следующие два файла:

  • T4MVC.tt
  • T4MVC.settings.t4

В качестве альтернативы для установки T4MVC вы можете использовать утилиту управления пакетами NuGet. На рисунке 13-7 вы можете увидеть эти два файла, добавленные в корневую папку нашего MVC приложения.

Рисунок 13-7: Наше приложение, включающее два файла T4MVC шаблонов.

Когда в проект добавляются T4MVC шаблоны или когда проект создается или запускается, то шаблоны генерируются заново. В некоторых средах может всплывать диалоговое окно предупреждения системы безопасности, как это продемонстрировано на рисунке 13-8.

Рисунок 13-8: Диалоговое окно предупреждения системы безопасности T4 шаблона.

Вы можете установить признак Do Not Show This Message Again, если вы не хотите, чтобы это диалоговое окно снова появлялось на экране, и нажать кнопку OK для запуска генерации шаблона.

T4MVC шаблон модифицирует существующие контроллеры, делая их частичными классами, и генерирует набор вспомогательных файлов. Эти вспомогательные файлы, продемонстрированные на рисунке 13-9, включают набор сгенерированных кодов частичных классов контроллеров и методов расширений.

Рисунок 13-9: Вспомогательные файлы, сгенерированные из T4MVC шаблонов.

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

Листинг 13-9: Первоначальное действие LogOff
public virtual ActionResult LogOff()
{
	FormsService.SignOut();
	return RedirectToAction("Index", "Home");
}

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

Листинг 13-10: Использование сгенерированного MVC класса для обращения к контроллерам и действиям
public virtual ActionResult LogOff()
{
	FormsService.SignOut();
	return RedirectToAction(MVC.Home.Index());
}

Новый метод RedirectToAction располагается в сгенерированном частичном классе контроллера. Метод Index из листинга 13-10 записыват названия контроллера и действия, позволяя сгенерированному методу RedirectToAction создавать корректный ActionResult. Все это скрыто, а наши существующие контроллеры могут начать использовать новые сгенерированные перегрузки для того, чтобы генерировать объекты ActionResult.

В наших представлениях мы будем использовать некоторые сгенерированные методы расширений HtmlHelper для того, чтобы генерировать ссылки на действия и URL-адреса. Ниже представлено наше модифицированное частичное представление авторизации:

Листинг 13-11: Использование сгенерированных методов расширений HtmlHelper
@if (Request.IsAuthenticated)
{
	<text>Welcome <b>@Context.User.Identity.Name</b>!
[ @Html.ActionLink("Log Off", MVC.Account.LogOff())
	|
	@Html.ActionLink("Profile",
		MVC.Admin.Profile.Show(Context.User.Identity.Name))
	]
	</text>
}
else
{
	@:[ @Html.ActionLink("Log On", MVC.Account.LogOn()) ]
}

Вместо того чтобы задавать информацию об области роута вручную, мы переходим к логической структуре иерархии контроллеров. ProfileController располагается в области Admin, а сгенерированный вспомогательный класс расположен в свойстве Admin. Иерархия классов, сгенерированная T4MVC, соответствует макету области и контроллеров нашего проекта. Если бы мы переименовали метод действия, то нам просто нужно было бы заново сгенерировать шаблоны, и наш код был бы обновлен соответствующим образом. Методы, обращающиеся к действиям, также включают в себя перегрузки, которые принимают первоначальные параметры действия, предоставляя нам возможность с легкостью дополнить параметры действий информацией о роуте. Действие Show принимает параметр username, который мы просто передаем напрямую.

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

или RSS канал: Что новенького на smarly.net