連載:改造WebアプリケーションUIビフォー/アフター

第1回 ASP.NETによる3階層Webアプリ「ITブック」構築

葛西秋雄
2010/02/05
Page1 Page2 Page3 Page4

プレゼンテーション層

 プレゼンテーション層は、ProductList.aspx、ProductDetail.aspx、ShoppingCart.aspxページから構成されます。


図4 プレゼンテーション層のWebページの流れ

 ProductList.aspxには、DataListコントロールを配置して商品リストを表示します。商品リストから商品を選択すると、ProductDetail.aspxに移動します。DataListから選択した商品は、クエリ文字列に商品のIDを指定して、以下のようなURLによりProductDetail.aspxに渡します。

ProductDetail.aspx?id=999

 ProductDetail.aspxには、Repeaterコントロールを配置して商品の詳細を表示します。商品の詳細から[カートに入れる]ボタンをクリックするとShoppingCart.aspxに移動します。

 ShoppingCart.aspxでは、ショッピング・カートを表示します。ショッピング・カートに格納されている商品は、個数を変更したり削除したりすることができます。[買い物を続ける]ボタンをクリックすると、ProductList.aspxに移動して商品リストを表示します。

■ProductList.aspxに商品の一覧を表示する

 ProductList.aspxには、DataListコントロールを配置してObjectDataSourceをバインドします。DataListのDataSourceIDプロパティにはObjectDataSourceのIDを設定します。RepeaterColumnsプロパティに「3」、RepeatDirectionプロパティに「Horizontal」を設定して商品を横3列で表示します。

<asp:DataList ID="dlProducts" runat="server"
  DataKeyField="ID"
  DataSourceID="odsProduct"
  RepeatColumns="3" RepeatDirection="Horizontal" >
  <ItemTemplate>
    ……
  </ItemTemplate>
</asp:DataList>
ProductList.aspxのDataListコントロールの定義

 DataListの<ItemTemplate>要素には、ProductクラスのID、ImageMedium、Title、PriceプロパティをEvalメソッドでバインドして表示します。

<ItemTemplate>
  <asp:HyperLink ID="hlnkCover" runat="server"
   NavigateUrl='<%# String.Format("ProductDetail.aspx?id={0}", Eval("ID")) %>'
   ImageUrl='<%# Eval("ImageMedium") %>'
   ToolTip="詳細を見る..." />

  <asp:HyperLink ID="hlnkTitle" runat="server"
   NavigateUrl='<%# String.Format("ProductDetail.aspx?id={0}", Eval("ID")) %>'
   ToolTip="詳細を見る..." >
   <asp:Literal ID="litTitle" runat="server" Text='<%# Eval("Title") %>'/>
  </asp:HyperLink>

  価格:
  <asp:Label ID="lblPrice" runat="server"
    Text='<%# String.Format("{0:n0}円", Eval("Price")) %>' />
</ItemTemplate>
DataListコントロールにおけるEvalメソッドによるバインド

 一方、ObjectDataSourceのTypeNameプロパティには、ビジネスロジック層のProductManagerクラスを設定します。SelecteMethodプロパティには、ProductManagerクラスのGetProductListメソッドを設定します。GetProductListメソッドは、Productクラスのコレクションを返します。

<asp:ObjectDataSource ID="odsProduct" runat="server"
  TypeName="ProductManager"
  SelectMethod="GetProductList">
</asp:ObjectDataSource>
ProductList.aspxのObjectDataSourceの定義

 ブラウザを起動してProductList.aspxを表示すると、DataListに商品リストが表示されます。商品のイメージまたは、タイトルをクリックすると「ProductDetail.aspx?id=999」に移動して商品の詳細が表示されます。


図5 DataListに商品の一覧が表示された

■ProductDetail.aspxに商品の詳細を表示する

 ProductDetail.aspxには、Repeaterコントロールを配置してObjectDataSourceをバインドします。RepeaterのDataSourceIDプロパティには、ObjectDataSourceのIDを設定します。

<asp:Repeater ID="rptProduct" runat="server" DataSourceID="odsProduct">
  <ItemTemplate>
    ……
  </ItemTemplate>
</asp:Repeater>
ProductDetail.aspxのRepeaterコントロールの定義

 Repeaterの<ItemTemplate>要素には、ProductクラスのID、Title、Description、Price、ImageLargeプロパティをEvalメソッドでバインドして表示します。

<ItemTemplate>
  <asp:Image ID="Image1" runat="server"
  ImageUrl='<%# Eval("ImageLarge") %>' />
  <asp:Button ID="btnAddToCart" runat="server" Text="カートに入れる"
  OnCommand="btnAddToCart_Command"
  CommandName="AddToCart"
  CommandArgument='<%# Eval("ID") %>' Font-Size="X-Large"  />
  <asp:Literal ID="litTitle" runat="server" Text='<%# Eval("Title") %>'/>
  <asp:Label ID="lblDescription" runat="server" Text='<%# Eval("Description") %>'/>
  <asp:Label ID="lblPrice" runat="server"  Text='<%# String.Format("{0:n0}円",  Eval("Price")) %>' />
  <asp:Button ID="btnAddToCart2" runat="server" Text="カートに入れる"
   OnCommand="btnAddToCart_Command"
   CommandName="AddToCart"
   CommandArgument='<%# Eval("ID") %>' />
  <input type="button" value="戻る" onclick="history.go(-1);" />
</ItemTemplate>
RepeaterコントロールにおけるEvalメソッドによるバインド

 ObjectDataSourceのTypeNameプロパティには、ビジネスロジック層のProductManagerクラスを設定します。そして、SelectMethodプロパティには、ProductManagerクラスのGetProductメソッドを設定します。

<asp:ObjectDataSource ID="odsProduct" runat="server"
  TypeName="ProductManager"
  SelectMethod="GetProduct">
  <SelectParameters>
  <asp:QueryStringParameter Name="intProductID" QueryStringField="id" Type="Int32" />
  </SelectParameters>
</asp:ObjectDataSource>
ProductDetail.aspxのObjectDataSourceの定義

 GetProductメソッドの引数には、商品のIDを指定する必要がありますので、<SelectParameters>コレクションに<QueryStringParameter>要素を追加して、QueryStringFieldプロパティにクエリ文字列「ID」を設定します。ProductList.aspxからProductDetail.aspxに移動するときは、次のようなクエリ文字列を渡します。

ProductDetail.aspx?id=999

 ブラウザを起動してProductList.aspxから商品を選択すると、ProductDetail.aspxに商品の詳細が表示されます。


図6 Repeaterに商品の詳細が表示された

 ProductDetail.aspxで[カートに入れる]ボタンをクリックすると、Webページがポストバックされて、ボタンのOnCommandイベント・ハンドラが実行されます。

 このイベント・ハンドラでは、ProductManagerクラスのGetProductメソッドを呼び出してProductクラス生成します。次に、ShopManagerクラスのAddProductToCartメソッドを呼び出してショッピング・カートに商品を追加します。そしてResponseオブジェクトのRedirectメソッドを実行してShoppingCart.aspxに移動します。

Protected Sub btnAddToCart_Command(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.CommandEventArgs) Handles btnAddToCart.Command

  If e.CommandName.Equals("AddToCart") Then

    Dim intID As Integer = Int32.Parse(e.CommandArgument)

    ' 選択した商品のProductクラスを生成する
    Dim clsProduct As Product = ProductManager.GetProduct(intID)

    ' 商品をショッピング・カートに追加する
    ShopManager.AddProductToCart(clsProduct)
    Response.Redirect("ShoppingCart.aspx")
  End If
End Sub
protected void btnAddToCart_Command(object sender, CommandEventArgs e) {

  if (e.CommandName.Equals("AddToCart")) {

    int intID = int.Parse( e.CommandArgument.ToString());

    // 選択した商品のProductクラスを生成する
    Product clsProduct = ProductManager.GetProduct(intID);

    // 商品をショッピング・カートに追加する
    ShopManager.AddProductToCart(clsProduct);
    Response.Redirect("ShoppingCart.aspx");
  }
}
ProductDetail.aspxのOnCommandイベント・ハンドラ(上:VB、下:C#)



 INDEX
  改造WebアプリケーションUIビフォー/アフター
  第1回 ASP.NETによる3階層Webアプリ「ITブック」構築
    1.「ITブック」のシステム構成
    2.データアクセス層とビジネスロジック層
  3.プレゼンテーション層(1)
    4.プレゼンテーション層(2)

インデックス・ページヘ  「改造WebアプリケーションUIビフォー/アフター」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

注目のテーマ

業務アプリInsider 記事ランキング

本日 月間
ソリューションFLASH