Чтение онлайн

на главную - закладки

Жанры

Шрифт:

public class DefaultPageController {

public DefaultPageController(_Default pg) { page = pg; }

public void ButtonSaveClick

{

page.lblResponse.Text = page.txtFirstName.Text + " "

+ page.txtLastName.Text;

}

public void PageLoad

{

if (!page.IsPostBack)

{

page.txtFirstName.Text = "Иван";

page.txtLastName.Text = "Кузнецов";

}

}

}

}

Листинг 2.5. Модифицированный файл Default.aspx.cs

using System;

using WebFormsMvc.Controllers;

namespace WebFormsMvc {

public partial class _Default:System.Web.UI.Page {

protected DefaultPageController controller;

protected void btnSave_Click(object sender, EventArgs e)

{

controller.ButtonSaveClick;

}

protected void Page_Load(object sender, EventArgs e)

{

controller = new DefaultPageController(this);

controller.PageLoad;

}

}

Теперь,

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

В листинге 2.6 приведен простейший unit-тест для проверки обработчика события загрузки страницы.

Листинг 2.6. Unit-тест для события загрузки страницы

[TestMethod]

public void TestPageLoad

_Default page = new _Default;

page.txtFirstName = new TextBox;

page.txtLastName = new TextBox;

DefaultPageController controller = new DefaultPageController(page);

controller.PageLoad;

Assert.AreEqual(page.txtLastName.Text, "Кузнецов");

}

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

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

Совмещение 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>

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

Поделиться:
Популярные книги

Миры Империума

Лаумер Кейт Джон
Шедевры фантастики
Фантастика:
научная фантастика
альтернативная история
8.12
рейтинг книги
Миры Империума

Денис Котик и царица крылатых лошадей

Зорич Александр
1. Денис Котик
Детские:
детская фантастика
6.57
рейтинг книги
Денис Котик и царица крылатых лошадей

Война и мир. Первый вариант романа

Толстой Лев Николаевич
Проза:
русская классическая проза
5.25
рейтинг книги
Война и мир. Первый вариант романа

Вечный. Книга II

Рокотов Алексей
2. Вечный
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Вечный. Книга II

Искатель приключений

де Монтепен Ксавье
Приключения:
исторические приключения
6.25
рейтинг книги
Искатель приключений

Запасной

Сассекский Гарри
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Запасной

Досье Сарагоса

де Вильмаре Пьер
1. Спецслужбы
Старинная литература:
прочая старинная литература
5.00
рейтинг книги
Досье Сарагоса

Путь Шедара

Кораблев Родион
4. Другая сторона
Фантастика:
боевая фантастика
6.83
рейтинг книги
Путь Шедара

Неучтенный элемент. Том 6

NikL
6. Антимаг. Вне системы
Фантастика:
фэнтези
5.25
рейтинг книги
Неучтенный элемент. Том 6

Товарищ "Чума"

lanpirot
1. Товарищ "Чума"
Фантастика:
попаданцы
альтернативная история
4.00
рейтинг книги
Товарищ Чума

Гримуар темного лорда VII

Грехов Тимофей
7. Гримуар темного лорда
Фантастика:
боевая фантастика
попаданцы
аниме
фэнтези
5.25
рейтинг книги
Гримуар темного лорда VII

Суд времени. Выпуски № 23-34

Млечин Леонид Михайлович
Научно-образовательная:
история
политика
5.00
рейтинг книги
Суд времени. Выпуски № 23-34

Гремучая змея (Сборник)

Стаут Рекс
Бестселлер
Детективы:
прочие детективы
6.60
рейтинг книги
Гремучая змея (Сборник)

Город древних

Муравьёв Константин Николаевич
2. Вселенная EVE Online
Фантастика:
фэнтези
боевая фантастика
попаданцы
8.20
рейтинг книги
Город древних