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

***************************

Собственно все, что необходимо для создания гаджетов — это вспомогательный метод Html.RenderAction(), который позволяет включить на страницу вывод произвольного действия произвольного контроллера. Например, на некоторых страницах сайта нужно добавить независимый блок, выводящий информацию о текущем курсе доллара. Для этого создается частичное представление, разметка которого приведена в листинге 5.17, и контроллер, код которого приведен в листинге 5.18.

Листинг 5.17. Частичное представление ExchangeRates.ascx

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>

<table style="border: solid 2px red; margin: 10px;">

  <tr>

    <td>

      1 USD =

    </td>

    <td>

      <%= ViewData["USD"] %> RUB

      RUB

    </td>

  </tr>

</table>

Листинг 5.18. Контроллер GadgetsController

using System.Web.Mvc;

using MvcViewsDemo.Services;

namespace MvcViewsDemo.Controllers

{

  public class GadgetsController : Controller

  {

    public ActionResult ExchangeRates()

    {

      ViewData["USD"] = ExchangeRatesService.GetRate("USD");

      return View();

    }

  }

}

Использовать гаджет ExchangeRates можно в любом представлении. Например, при использовании в представлении Index, код которого показан в листинге 5.19, получается результат, приведенный на рис. 5.4.

Листинг 5.19. Представление Index.aspx, использующее гаджет ExchangeRates

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master"

                  Inherits="System.Web.Mvc.ViewPage" %>

<%@ Import Namespace="Microsoft.Web.Mvc" %>

<%@ Import Namespace="MvcViewsDemo.Models" %>

<asp:Content ID="indexTitle" ContentPlaceHolderID="TitleContent"

               runat="server">

  Домашняя страница

</asp:Content>

<asp:Content ID="indexContent" ContentPlaceHolderID="MainContent"

               runat="server">

  <h2>

    <%= Html.Encode(ViewData["Message"]) %>

  </h2>

  <table>

    <thead>

      <tr>

        <th>

          Название компании

        </th>

        <th>

          Контактное лицо

        </th>

      </tr>

    </thead>

    <% foreach (

         Customer c in (IEnumerable<Customer>)ViewData["Customers"])

    { %>

      <tr>

        <td>

          <%= c.CompanyName %>

        </td>

        <td>

          <%= c.ContactName %>

        </td>

      </tr>

    <% } %>

  </table>

  <% Html.RenderAction("ExchangeRates", "Gadgets"); %>

</asp:Content>

В листинге 5.19 отмечено, что для использования метода Html.RenderAction() необходимо подключить пространство имен Microsoft.Web.Mvc. Также из листинга 5.19 видно, что гаджету не передается никаких дополнительных данных, поскольку он полностью независим от страницы, на которой отображается.

Примечание

Для того чтобы не добавлять директиву Import в разметку представления, можно подключить пространство имен Microsoft.Web.Mvc для всех файлов проекта в разделе namespaces файла web.config.

*********************

Asp.net mvc framework - img_39

Удобство использования гаджетов для независимых блоков на страницах в том, что в процессе развития проекта могут меняться контроллеры, действия и представления, используемые веб-приложением, однако код независимых блоков легко может быть перенесен на другие страницы и модифицирован, просто лишь перестановкой вызова Html.RenderAction(). Кроме того, появляется дополнительная степень свободы в модификации самих гаджетов без необходимости затрагивать код основных контроллеров и представлений. Например, код гаджета может быть доработан так, как показано в листингах 5.20, 5.21, чтобы получить результат, представленный на рис. 5.5.

Листинг 5.20. Доработанное частичное представление ExchangeRates

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>

<table style="border: solid 2px red; margin: 10px;">

  <% foreach (var rate in (Dictionary<string, double>)ViewData["rates"])

  { %>

    <tr>

      <td>

        1

        <%= rate.Key %>

      </td>

      <td>

        <%= rate.Value %> RUB

      </td>

    </tr>

  <% } %>

</table>

Листинг 5.21. Доработанный контроллер Gadgets

using System.Web.Mvc;

using MvcViewsDemo.Services;

using System. Collections.Generic;

namespace MvcViewsDemo.Controllers

{

  public class GadgetsController : Controller

  {

    public ActionResult ExchangeRates()

    {

      Dictionary<string, double> rates =

        new Dictionary<string, double>();

      rates.Add("USD", ExchangeRatesService.GetRate("USD"));

      rates.Add("EUR", ExchangeRatesService.GetRate("EUR"));

      ViewData["Rates"] = rates;

      return View();

    }

  }

}

В качестве представлений для гаджетов могут использоваться не только частичные представления ASCX, но и полноценные представления ASPX, включая поддержку мастерских страниц. Однако в большинстве случаев гаджеты являются лишь небольшими фрагментами HTML-разметки, и использование частичных представлений выглядит органично.

Asp.net mvc framework - img_40

Заключение

Материала, представленного в главах 1—5, достаточно для того, чтобы начать создавать базовые веб-приложения с использованием MVC Framework. В следующих главах вы познакомитесь ближе с механизмами маршрутизации и разработкой клиентской части веб-приложений и будете готовы к разработке веб-приложений любой сложности.

ГЛАВА 6

Механизмы маршрутизации

 Начиная с версии .NET Framework 3.5 SP1, ASP.NET содержит новый механизм маршрутизации пользовательских запросов. Основным предназначением механизма маршрутизации является предоставление возможности осуществлять запросы к веб-приложению не на основании файлов и файловой структуры приложения, а на основании специально определенных шаблонов, которые называются маршрутами.

Механизм маршрутизации не является составной частью MVC Framework. Представленный в .NET Framework 3.5 SP1, этот механизм является составной частью ASP.NET и может быть использован в любом проекте ASP.NET, основанном как на WebForms, так и на MVC Framework.

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