Рассмотрим ASPX-страницу, приведенную в листинге 2.1. На этой странице размещены несколько элементов управления Label, TextBox
и Button
. Логика страницы должна быть простой, и в классической модели WebForms описывается в code-behind-файле, код которого приведен в листинге 2.2.
Листинг 2.1. Страница Default.aspx
<%@ Page Language="C#" AutoEventWireup="true"
CodeBehind="Default.aspx.cs" Inherits="WebFormsMvc._Default" %>
<!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 id="form1" runat="server">
<div>
<div>
Ответ сервера:
<asp:Label ID="lblResponse" runat="server"
Text="noKa HeT"></asp:Label>
</div>
<table>
<tr>
<td>
Имя:
</td>
<td>
<asp:TextBox ID="txtFirstName"
runat="server"></asp:TextBox>
</td>
</tr>
<tr>
<td>
Фамилия:
</td>
<td>
<asp:TextBox ID="txtLastName"
runat="server"></asp:TextBox>
</td>
</tr>
<tr>
<td colspan="2">
<asp:Button ID="btnSave" runat="server"
Text="Coxpaнить" onclick="btnSave_Click" />
</td>
</tr>
</table>
</div>
</form>
</body>
</html>
Листинг 2.2. Файл Default.aspx.cs
using System;
using WebFormsMvc.Controllers;
namespace WebFormsMvc {
{
protected void btnSave_Click(object sender, EventArgs e) {
lblResponse.Text = txtFirstName.Text + " "
+ txtLastName.Text; }
}
}
Для того чтобы выделить отдельный компонент контроллер, который будет отвечать за логику обработки запросов к странице, таких, например, как щелчок по кнопке или загрузка первоначальных значений в текстовые поля, необходимо обеспечить возможность контроллера модифицировать модель, отображением которой является представление. В случае ASPX-страницы моделью является собственно сама объектная модель страницы, поэтому именно к ней нужно предоставить доступ контроллеру — для этого достаточно отредактировать CS-файл, автоматически создаваемый Visual Studio для страницы, и сделать все поля, соответствующие элементам управления на форме, публичными, как это приведено в листинге 2.3.
Листинг 2.3. Модифицированный файл Default.aspx.designer.cs
namespace WebFormsMvc {
public partial class _Default {
public globaclass="underline" :System.Web.UI.HtmlControls.HtmlForm form1;
public globaclass="underline" :System.Web.UI.WebControls.Label lblResponse;
public globaclass="underline" :System.Web.UI.WebControls.TextBox txtFirstName;
public globaclass="underline" :System.Web.UI.WebControls.TextBox txtLastName;
public globaclass="underline" :System.Web.UI.WebControls.Button btnSave;
}
}
После этого можно создать отдельный класс-контроллер для страницы Default.aspx, код которого приведен в листинге 2.4, и обращаться к нему из обработчиков событий страницы, как это показано в листинге 2.5. Обработчики событий страницы, в данном случае, выполняют только утилитарную роль привязки вызовов методов контроллера к событиям страницы.
Листинг 2.4. Файл DefaultPageControNer.cs
namespace WebFormsMvc.Controllers {
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 {