Литмир - Электронная Библиотека

      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>

      </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 (http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24471) можно на странице проекта MVC Framework на портале CodePlex. После подключения этой сборки к проекту функциональность по созданию гаджетов будет доступна в проекте.

Примечание

В проект MVC Futures входит код, не вошедший по каким-либо причинам в основную поставку MVC Framework. Причины могут быть разными — от недостаточной стабильности кода до желания разработчиков придумать лучшее решение в следующей версии. Однако вас не должна страшить потенциальная возможность того, что поддержка гаджетов никогда не будет включена в том виде, в котором она представлена в MVC Futures, в сам MVC Framework, поскольку вам доступен полный исходный MVC Futures, и вы можете использовать его непосредственно в ваших проектах. Более того, вы можете выделить только ту часть исходного кода, которая используется в ваших проектах, и перенести его из сборки MVC Futures Microsoft.Web.Mvc.dll в сборку вашего проекта.

42
{"b":"971383","o":1}