ЖАНРЫ

Шрифт:

List<SelectListItem> months = new List<SelectListItem>;

string monthValue = GetValue(html, MONTH_PREFIX + id);

for (int i = 0; i <= 12; i++)

{

months.Add(new SelectListItem

{

Text = (i == 0) ? String.Empty :

DateTimeFormatInfo.CurrentInfo.MonthNames[i — 1],

Value = i.ToString,

Selected = (monthValue == i.ToString)

});

}

sb.AppendLine(SelectList(MONTH_PREFIX + id, months));

// generate years

List<SelectListItem> years = new List<SelectListItem>;

string yearValue = GetValue(html, YEAR_PREFIX + id);

for (int i = 1900; i <= DateTime.Now.Year; i++)

{

years.Add(new SelectListItem

{

Text = (i == 1900) ? String.Empty : i.ToString,

Value = i.ToString,

Selected = (yearValue == i.ToString)

});

}

sb.AppendLine(SelectList(YEAR_PREFIX + id, years));

// parent tag

if (!String.IsNullOrEmpty(text))

{

TagBuilder div = new TagBuilder("div");

div.Attributes.Add("id", id);

div.InnerHtml = text + sb.ToString;

sb = new StringBuilder(

div.ToString(TagRenderMode.Normal));

}

return sb.ToString;

}

private static string GetValue(HtmlHelper html, string id)

{

object o = null;

if (html.ViewData != null)

o = html.ViewData.Eval(id);

if (o == null)

o = html.ViewContext.RequestContext.HttpContext.Request.Params[id];

return (o == null) ? String.Empty : o.ToString;

}

}

Использование серверных элементов управления WebForms

В главе 2, в разд. "Использование элементов управления WebForms в MVC-приложениях” уже была продемонстрирована возможность применения серверных элементов управления в представлениях MVC. Как уже было сказано ранее, использование серверных элементов управления может быть оправдано, если не требуется интерактивное взаимодействие с соответствующим элементом, и он используется только для генерации разметки.

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

Сделать это можно просто, учитывая, что класс Webcontrol, которому наследуют классы конкретных элементов управления, содержит метод Render, генерирующий разметку. Как раз метод Render применяет инфраструктура WebForms для всех элементов управления на страницах. Пример использования элемента управления WebForms приведен в листинге 5.14.

Листинг 5.14. Пример использования класса Button во вспомогательном методе

public static class WebFormsHelper {

public static string WebFormsButton(this HtmlHelper html)

{

Button control = new Button { Text = "Web Forms Button" };

StringBuilder sb = new StringBuilder;

HtmlTextWriter htmlWriter = new HtmlTextWriter(

new StringWriter(sb));

control.RenderControl(htmlWriter);

return sb.ToString;

}

}

Листинг 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>

Поделиться с друзьями: