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

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

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

Создание виджета RSS с помощью выделенной области

Представьте себе выделенную область, которая обеспечивала бы виджет веб-страницы для отображения RSS-новостей в виде неупорядоченного списка. Мы пройдемся по примеру и рассмотрим то, как можно добавить вспомогательный объект, чтобы облегчить использование выделенной области.

Создание примера выделенной области RSS-виджета

На рисунке 19-3 продемонстрирована структура Visual Studio для выделенной области RssWidget.

Рисунок 19-3: Макет выделенной области RssWidget

Проект RssWidget, продемонстрированный на рисунке 19-3, содержит все файлы, являющиеся частью этой выделенной области. Интересным различием между этим примером RssWidget и предыдущим примером является добавление классов SyndicationService и HtmlHelperExtensions. Данный пример демонстрирует, что вы можете включить в выделенную область законченный элемент. Мы обнаружили, что посредством включения в проекты пользовательских вспомогательных HTML-методов значительно повышается удобство использования области.

Давайте пройдемся по коду.

Листинг 19-6: Регистрация RssWidget
using System.Web.Mvc;
using MvcContrib.PortableAreas;
namespace RssWidgetPortableArea
{
	public class RssWidgetAreaRegistration : PortableAreaRegistration
	{
		public override string AreaName
		{
			get { return "RssWidget"; }
		}

		public override void RegisterArea(AreaRegistrationContext context, IApplicationBus bus)
		{
			context.MapRoute(
				"RssWidget_default",
				"RssWidget/{controller}/{action}/{id}",
				new { action = "Index", id = "" });
				RegisterTheViewsInTheEmbeddedViewEngine(GetType());
		}
	}
}

Строка 14: Преобразует роуты для области

Строка 18: Регистрирует вложенные представления

Код регистрации для области является шаблонным. Он включает стандартные вызовы MapRoute и RegisterTheViewsInTheEmbeddedViewEngine. Для этого примера не требуется никакого особенного кода регистрации.

В эту выделенную область включено только одно действие – метод RssWidgetController.Index. Этот метод является стандартным. Единственной его целью является связывание вместе RssUrl и зависимости SyndicationService. Просмотрите листинг 19-7 для более подробной информации о методе Index.

SyndicationService обеспечивает логику извлечения RSS-новости из URL и возвращения модели новости. Затем контроллер отправляет эту модель в представление для форматирования, как это показано ниже.

Листинг 19-7: RssWidgetController передает содержимое новости в представление
using System.Web.Mvc;
namespace RssWidgetPortableArea.Controllers
{
	public class RssWidgetController : Controller
	{
		public ActionResult Index(string RssUrl)
		{
			var service = new SyndicationService();
			var feed = service.GetFeed(RssUrl, 10)
			return View(feed);
		}
	}
}

Строка 9: Получает новость на основании RssUrl

Новость отображается с помощью простого представления (продемонстрировано в листинге 19-8), которое создаст неупорядоченный список строк в RSS-новости. Код в этом представлении довольно прост. Он выполняет цикл по коллекции объектов System.ServiceModel.Syndication.SyndicationFeed и отображает Title и Author для каждого элемента.

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

Ниже продемонстрировано представление для отображения RSS-новости:

Листинг 19-8: Представление для действия RssWidget.Index
@model System.ServiceModel.Syndication.SyndicationFeed
<ul>
	@foreach(var item in Model.Items) {
	<li>
		@item.Title.Text - @item.Authors[0].Name
	</li>
	}
</ul>

Представление в данном листинге выполняет цикл по каждой строке новости и отображает заголовок, а также автора внутри неупорядоченного списка.

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

Листинг 19-9: Вызов расширения RssWidget HtmlHelper
@using RssWidgetPortableArea
@Html.RssWidget("http://search.twitter.com/search.atom?q=%23MVC4iA")

Строка 1: Импортирует пространство имен вспомогательного метода

Строка 2: Вызывает вспомогательный метод RssWidget

Единственной строкой кода в приложении, которая вызывает выделенную область, является вызов метода RssWidget. После вызова этого метода и запуска простого представления отображается результирующая веб-страница, как это показано на рисунке 19-4. Представление всего лишь находит по ссылке RSS-новость сообщений твиттера, содержащих "MVC4iA". Заголовок и пользователь будут показаны на экране.

Рисунок 19-4: Представление, использующее выделенную область RssWidget

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

Например, предполагается, что RssWidget будет использоваться при вызове в методе RenderAction метода Index для RssWidgetController. Для того чтобы осуществить этот вызов, необходимо название области, зарегистрированное в блоке регистрации области; в данном примере название области – RssWidget. Реализация вспомогательного метода RssWidget продемонстрирована ниже.

Листинг 19-10: Скрытие сложности в методе расширении HtmlHelper
using System.Web.Mvc;
using System.Web.Mvc.Html;
namespace RssWidgetPortableArea
{
	public static class HtmlHelperExtensions
	{
		public static void RssWidget(this HtmlHelper helper, string RssUrl)
		{
			helper.RenderAction("Index", "RssWidget",
				new { RssUrl, Area = "RssWidget" });
		}
	}
}

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

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

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