Asp.net mvc framework
Шрифт:
}
}
Листинг 5.14 демонстрирует концепцию использования серверных элементов управления: создать экземпляр класса элемента управления, задать его свойства, вызвать при необходимости методы, а затем сгенерировать разметку, которая будет возвращена вспомогательным методом.
В каких случаях подобный подход к использованию серверных элементов управления может быть оправдан? В случаях, когда у вас есть существующий элемент управления, отвечающий вашим требованиям, и для которого подобная обертка может быть удобной в использовании. Универсального рецепта для принятия решения, стоит ли использовать элемент управления подобным образом, — нет, однако имеет смысл задуматься в случае, когда для элемента управления приходится эмулировать серверные события. Зачастую в подобных ситуациях проще реализовать поддержку необходимой функциональности в самих вспомогательных методах.
Частичные представления
Ранее в этой главе уже говорилось об использовании частичных представлений. Механизм частичных представлений позволяет многократно использовать разметку в разных методах контроллеров, аналогично примеру из листингов 5.1—5.3. Кроме того, частичные представления могут быть использованы для отображения списков элементов. Так, в листинге 5.15 приведено частичное представление, которое используется для отображения строк таблицы товаров в представлении Index.aspx, код которого приведен в листинге 5.16.
Листинг 5.15. Частичное представление ProductListItem.ascx
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<
MvcViewsDemo.Models.Product>" %>
<tr>
<td>
<%= Html.ActionLink("Изменить", "Edit", new { id=Model.ProductID }) %>
</td>
<td>
<%= Html.Encode(Model.ProductID)%>
</td>
<td>
<%= Html.Encode(Model.ProductName)%>
</td>
<td>
<%= Html.Encode(String.Format("{0:F}", Model.UnitPrice))%>
</td>
<td>
<%= Html.Encode(Model.UnitsInStock)%>
</td>
<td>
<%= Html.Encode(Model.UnitsOnOrder)%>
</td>
</tr>
Листинг 5.16. Представление Index.aspx
<%@ Page Title="" Language="C#"
MasterPageFile="~/Views/Shared/Site.Master"
Inherits="System.Web.Mvc.ViewPage<IEnumerable<
MvcViewsDemo.Models. Product»" %>
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent"
runat="server">
Список товаров
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent"
runat="server">
<h2>
Список товаров
</h2>
<table>
<tr>
<th>
</th>
<th>
Код товара </th>
<th>
Название
</th>
<th>
Цена
</th>
<th>
На складе
</th>
<th>
Заказано
</th>
</tr>
<% foreach (var item in Model)
{ %>
<% Html.RenderPartial("ProductListItem", item); %>
<% } %>
</table>
</asp:Content>
Вынесение оформления элемента списка в частичное представление позволяет разгрузить код разметки самого представления, а также повторно использовать оформление элемента представления на других представлениях, если это разумно с точки зрения логики приложения.
Создание гаджетов
Частичные представления также могут быть использованы для создания гаджетов — элементов страницы, содержащих данные, не связанные с основным представлением. Гаджеты находят широкое применение на страницaх всевозможных порталов — когда есть основная страница, с которой работает пользователь, и куда выводятся дополнительные независимые информационные блоки, например, баннеры или текстовые ссылки рекламных сетей.
Разумеется, можно реализовать похожую функциональность так, как это показано в листингах 5.1—5.3, разместив частичные представления на мастерской странице. Однако часто оказывается удобным вынести функциональность гаджета в отдельное представление и полностью отделить логику гаджета от основных представлений. В поставку MVC Framewrok функциональность по созданию гаджетов не входит, однако она доступна в проекте MVC Futures. Скачать код и сборку MVC Futures можно на странице проекта MVC Framework на портале CodePlex. После подключения этой сборки к проекту функциональность по созданию гаджетов будет доступна в проекте.
Примечание
В проект MVC Futures входит код, не вошедший по каким-либо причинам в основную поставку MVC Framework. Причины могут быть разными — от недостаточной стабильности кода до желания разработчиков придумать лучшее решение в следующей версии. Однако вас не должна страшить потенциальная возможность того, что поддержка гаджетов никогда не будет включена в том виде, в котором она представлена в MVC Futures, в сам MVC Framework, поскольку вам доступен полный исходный MVC Futures, и вы можете использовать его непосредственно в ваших проектах. Более того, вы можете выделить только ту часть исходного кода, которая используется в ваших проектах, и перенести его из сборки MVC Futures Microsoft.Web.Mvc.dll в сборку вашего проекта.
***************************
Собственно все, что необходимо для создания гаджетов — это вспомогательный метод Html.RenderAction, который позволяет включить на страницу вывод произвольного действия произвольного контроллера. Например, на некоторых страницах сайта нужно добавить независимый блок, выводящий информацию о текущем курсе доллара. Для этого создается частичное представление, разметка которого приведена в листинге 5.17, и контроллер, код которого приведен в листинге 5.18.