Asp.net mvc framework
Шрифт:
<asp:BoundField DataField="FirstName"
HeaderText="FirstName" SortExpression="FirstName" />
</Columns>
</asp:GridView>
</form>
</asp:Content>
Результат обращения к действию Index контроллера Home представлен на рис. 2.2. Если, к примеру, включить возможность сортировки в GridView, после чего щелкнуть по ссылке в заголовке таблицы, то будет отображена ошибка,
Очевидно, что указанные ограничения функциональности элементов управления делают подобное использование элементов управления, требующих обработки серверных событий, непригодными для использования в представлениях. Для таких элементов управления стоит рассмотреть методику внедрения полноценных WebForms-страниц в MVC-приложение.
С другой стороны, для элементов, отвечающих только за генерацию разметки, такое использование может быть оправдано.
Внедрение страниц 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.
Листинг 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
Рассмотрим сценарий расширения существующего WebForms-приложения с использованием MVC Framework. Для этого нужно выполнить несколько простых шагов:
1. Установить в свойствах веб-приложения версию .NET Framework 3.5, поскольку если приложение WebForms было разработано для версии .NET Framework 2.0, то MVC Framework для нее не поддерживается.
2. Добавить ссылки на сборки System.Web.Mvc и System.Web.Routing.
3. Зарегистрировать в файле web.config необходимые для функционирования MVC-приложения обработчики в разделе system.web/httpModules (листинг 2.9) и system/webServer/modules и system/webServer/handlers (листинг 2.10). Необходимые изменения выделены полужирным. Кроме того, поскольку в листингах 2.9 и 2.10 сборки указываются без описания версий, необходимо в директорию bin веб-приложения скопировать файлы System.Web.Mvc.dll и System.Web.Routing.dll. Либо указать полные имена сборок, посмотрев описания в тестовом MVC-приложении, которое стоит создать по такому случаю.
4. Зарегистрировать пространства имен, которые будут использовать представления (листинг 2.11).
5. Создать таблицу маршрутизации в файле global.asax (листинг 2.12).
6. Создать директорию /Controllers, разместить в ней контроллеры.
7. Создать директорию /Views и разместить в ней дерево представлений, отвечающее контроллерам и их действиям (рис. 2.5).
Листинг 2.9. Регистрация модуля MVC Framework в web.config
<system.web>
<httpModules>
<add name="UrlRoutingModule"
type=" System.Web.Routing.UrlRoutingModule,
System.Web.Routing" />
<add name="ScriptModule"
type="System.Web.Handlers.ScriptModule,
System.Web.Extensions"/>
</httpModules>
Листинг 2.10. Регистрация модулей и обработчиков MVC Framework в web.config
<system.webServer>
<validation validateIntegratedModeConfiguration="false"/>
<modules runAllManagedModulesForAllRequests="true">
<add name="ScriptModule" preCondition="managedHandler"
type="System.Web.Handlers.ScriptModule,
System.Web.Extensions"/>
<add name="UrlRoutingModule" type="
System.Web. Routing.UrlRoutingModule,
System.Web.Routing" />
</modules>
<handlers>