Classic ASP.NETでのMVPパターンの適用

ASP.NETで長時間実行されるプロジェクトに出くわしたことはありますか?

たぶん、あなたは今そのようなプロジェクトに取り組んでいますか?

その場合、ページクラス内で複雑に絡み合った一連のイベント、ロジック、および検証に遭遇した可能性があります。

この記事では、同じModel-View-Presenterテンプレートを使用して、そのようなプロジェクトの作業を単純化する方法について説明します。



この記事では、MVCパターンに精通していることを詳しく説明しません。



MVCと従来のASP.NETが提供する可能性との関連付けを試みます。



1.ルーティング-要求処理

ほとんどの場合、サイトのフォルダーツリーは同じ目的に使用できます。



2.ビューとPartialView-データ表示

これらの目的には、それぞれPageクラスとUserControlが最適です。



3.モデル-データ

モデルのクラスは、おそらく何らかの形でシステムに存在します。



4.プレゼンター-データとプレゼンテーションの接着剤

残念ながら、ASP.NETはこのタイプのオブジェクトを提供していません。



次に、プレゼンターの実装について説明します。

プレゼンターの目的は、ユーザーに表示するデータを準備し、ユーザーが入力したデータを処理することです。

プレゼンテーションの目的は、ユーザーにデータを表示し、ユーザーからデータを受信することです。



プレゼンテーションとプレゼンターがどれだけ賢いかについては、さまざまな意見があります。

コンセンサスがないため、環境に依存する実装の有効性から進めることを好みます。 この場合、既存のASP.NETライブラリから、このような機会が存在するため、十分に使用したいかなりスマートなコントロールを幅広く持っています。



最後に、実装に進みます。



PageViewとUserControlViewの2つのクラスを作成します。

public abstract class PageView<T>: Page where T : class { private T _presenter; public T Presenter { get { return _presenter ?? (_presenter = CreatePresenter()); } } protected abstract T CreatePresenter(); } public class UserControlView<T> : UserControl { public T Presenter { get; set; } }
      
      





PageViewクラスは抽象的であり、子孫のプレゼンターの独立した作成を伴います。

UserControlViewクラスには、Presenterという唯一のプロパティがあります。これは、ユーザー要素が存在する親によって初期化されます。



ページプレゼンターには、カスタム要素のプレゼンターが含まれていると想定されています。



リストとその要素の実装例:



List.aspx

 <%@ Page Title="" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="List.aspx.cs" Inherits="WebApplication1.Client.List" EnableViewState="false" %> <%@ Register TagPrefix="ctl" TagName="Item" Src="Details.ascx" %> <asp:Content ContentPlaceHolderID="MainContent" runat="server"> <asp:Repeater ID="ctlList" runat="server" > <ItemTemplate> <ctl:Item runat="server" Presenter="<%# Container.DataItem %>" /> </ItemTemplate> </asp:Repeater> </asp:Content>
      
      





List.aspx.cs

 public partial class List : PageView<ListPresenter> { protected override ListPresenter CreatePresenter() { return new ListPresenter(); } protected override void OnLoad(System.EventArgs e) { base.OnLoad(e); ctlList.DataSource = Presenter.Items; ctlList.DataBind(); } }
      
      





Details.aspx

 <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Details.ascx.cs" Inherits="WebApplication1.Client.Details" %> <asp:TextBox runat="server" Text="<%# Presenter.Model.FirstName %>" OnTextChanged="OnFirstNameChanged" /> <asp:TextBox runat="server" Text="<%# Presenter.Model.LastName %>" OnTextChanged="OnLastNameChanged" /> <asp:Button runat="server" Text="Save" OnClick="OnSave" /> <br />
      
      





Detalis.aspx.cs

 public partial class Details : UserControlView<DetailsPresenter> { protected void OnFirstNameChanged(object sender, System.EventArgs e) { Presenter.Model.FirstName = ((TextBox) sender).Text; } protected void OnLastNameChanged(object sender, System.EventArgs e) { Presenter.Model.LastName = ((TextBox)sender).Text; } protected void OnSave(object sender, System.EventArgs e) { Presenter.Save(); } }
      
      







ちなみに、ページのViewStateはオフになっていることに注意してください。



完全な例はこちらからダウンロードできます



このアプローチの利点:

1.ページコードがはるかに単純になります

2.プレゼンタークラスの単体テストを作成できます

3.プレゼンターを使用して、さまざまなインターフェイス(web、win、mobile)を実装できます

4. noodleコードと組み合わせて使用​​し、アプリケーションを徐々にアップグレードできます



私の経験がお役に立てば幸いです。



All Articles