Выбрать главу

Рассмотрим 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 {