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

Совмещение WebForms и MVC Framework в рамках одного веб-приложения

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

В этих случаях можно подумать над совмещением технологий WebForms и MVC Framework, возможно, несколько жертвуя принципами архитектуры MVC.

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

Поскольку в MVC Framework в качестве движка представлений по умолчанию используется стандартный механизм ASPX-страниц, то можно попробовать использовать существующие элементы управления на MVC-страницах. Однако нужно помнить о том, что для представлений в MVC-приложениях не работает стандартный механизм обработки событий, и элементы управления теряют свои серверные возможности по обработке событий. Поэтому для подобного использования пригодны элементы управления, представляющие ценность на этапе первоначальной генерации разметки, отправляемой пользователю, такие как, например, Repeater или GridView.

Чтобы продемонстрировать эту возможность, используем декларативный источник данных sqlDataSource и GridView в представлении Index.aspx, в результате получим страницу, приведенную на рис. 2.1. Код страницы приведен в листинге 2.7.

Листинг 2.7. Страница Index.aspx

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

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

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

           runat="server">

  Home Page

</asp:Content>

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

          runat="server">

  <h2>

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

  </h2>

  <form runat="server">

    <asp:SqlDataSource ID="SqlDataSource1" runat="server"

      ConnectionString="<%$ ConnectionStrings:ConnectionString %>"

      SelectCommand="SELECT * FROM [Persons]">

    </asp:SqlDataSource> <br />

    <asp:GridView ID="GridView1" runat="server"

        AutoGenerateColumns="False"

        DataKeyNames="PersonId" DataSourceID="SqlDataSource1">

      <Columns>

        <asp:BoundField DataField="PersonId"

          HeaderText="PersonId" InsertVisible="False"

          ReadOnly="True" SortExpression="PersonId" />

        <asp:BoundField DataField="LastName"

          HeaderText="LastName" SortExpression="LastName" />

        <asp:BoundField DataField="FirstName"

          HeaderText="FirstName" SortExpression="FirstName" />

      </Columns>

    </asp:GridView>

  </form>

</asp:Content>

Asp.net mvc framework - img_10

Результат обращения к действию Index контроллера Home представлен на рис. 2.2. Если, к примеру, включить возможность сортировки в GridView, после чего щелкнуть по ссылке в заголовке таблицы, то будет отображена ошибка, представленная на рис. 2.3, поскольку MVC Framework не позволяет корректно обработать серверные события.

Asp.net mvc framework - img_11

Очевидно, что указанные ограничения функциональности элементов управления делают подобное использование элементов управления, требующих обработки серверных событий, непригодными для использования в представлениях. Для таких элементов управления стоит рассмотреть методику внедрения полноценных WebForms-страниц в MVC-приложение.

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

Asp.net mvc framework - img_12

Внедрение страниц WebForms в MVC-приложения

Чтобы использовать страницу WebForms в MVC-приложении, нет необходимости писать большое количество кода. Поскольку MVC-приложение по сути является ASP.NET-приложением, и при его создании нет препятствий к использованию WebForms, все, что нужно сделать — объяснить системе маршрутизации MVC Framework, что для страниц WebForms эту самую систему маршрутизации использовать не надо. Для этого достаточно добавить в файле Global.asax в метод RegisterRoutes правило для игнорирования путей к страницам ASPX:

routes.IgnoreRoute("{resource}.aspx/{"pathInfo}");

После этого в MVC-приложение можно добавить стандартную ASPX-страницу, например WebForm1.aspx, код которой приведен в листинге 2.8, и для этой страницы будет обеспечена полноценная функциональность WebForms, что подтверждает рис. 2.4.

Asp.net mvc framework - img_13

Листинг 2.8. Страница WebForml.aspx

<%@ Page Language="C#" AutoEventWireup="true"

      CodeBehind="WebForm1.aspx.cs"

      Inherits="MvcWebFormsCompositeApp.WebForm1" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head runat="server">

  <title></title>

</head>

<body>

  <form runat="server">

    <asp:SqlDataSource ID="SqlDataSource1" runat="server"

      ConnectionString="<%$ ConnectionStrings:ConnectionString %>"

      SelectCommand="SELECT * FROM [Persons]">

    </asp:SqlDataSource>

    <br/>

    <asp:GridView ID="GridView1" runat="server"

         AutoGenerateColumns="False" DataKeyNames="PersonId"

         DataSourceID="SqlDataSource1">

      <Columns>

        <asp:BoundField DataField="PersonId"

             HeaderText="PersonId"

             InsertVisible="False" ReadOnly="True"

             SortExpression="PersonId" />

        <asp:BoundField DataField="LastName"

             HeaderText="LastName" SortExpression="LastName" />

        <asp:BoundField DataField="FirstName"

             HeaderText="FirstName" SortExpression="FirstName" />

      </Columns>

    </asp:GridView>

  </form>

</body>

</html>

Использование MVC Framework в существующих решениях WebForms

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