SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

実例で学ぶASP.NET Webフォーム業務アプリケーション開発のポイント

3層データバインドを正しく活用しよう(後編)

実例で学ぶASP.NET Webフォーム業務アプリケーション開発のポイント 第2回


  • X ポスト
  • このエントリーをはてなブックマークに追加

プレゼンテーション層の作成

 最後にプレゼンテーション層となるWebサイトを作成していきましょう。

[1]場所検索画面を作成する

 まずは場所検索画面です。Location.aspxファイルを作成し、検索条件とObjectDataSourceコントロール、GridViewコントロールを次のように配置します。

 なお、紙面の都合上、以後のソースはポイントとなる部分を抜粋して掲載します。ソースのすべてを見たい場合は、サンプルを確認してください。

リスト7 Location.aspx
<p>
  場所名 :
  <asp:TextBox ID="LocationNameTextBox" runat="server"></asp:TextBox>
  <asp:Button ID="SearchButton" runat="server" Text="検索" />
</p>
<!-- (1) -->
<asp:ObjectDataSource ID="LocationsObjectDataSource" runat="server"
  TypeName="MRRS.BLL.LocationLogic" DataObjectTypeName="MRRS.Entity.Location"
  SelectMethod="Select">
  <SelectParameters>
    <asp:ControlParameter ControlID="LocationNameTextBox"
      PropertyName="Text" Name="locationName" Type="String" />
  </SelectParameters>
</asp:ObjectDataSource>
<!-- (2) -->
<asp:GridView ID="LocationsGridView" runat="server" AutoGenerateColumns="False"
  DataSourceID="LocationsObjectDataSource" DataKeyNames="LocationId"
  onselectedindexchanged="LocationsGridView_SelectedIndexChanged">
  <Columns>
    <asp:CommandField ShowSelectButton="True" />
    <asp:BoundField DataField="LocationName" HeaderText="場所"
      SortExpression="LocationName" />
  </Columns>
  <EmptyDataTemplate>
    検索条件に該当するデータがありません。
  </EmptyDataTemplate>
</asp:GridView>
(1)ObjectDataSourceコントロールのプロパティ

 それぞれのプロパティは次のように設定します。

ObjectDataSourceコントロールのプロパティ
プロパティ名 設定値 説明
TypeName MRRS.BLL.LocationLogic データアクセスに使う型名を指定します
DataObjectTypeName MRRS.Entity.Location 取得するデータの型名を指定します(複数項目ある場合は","で区切る)
SelectMethod Select TypeNameプロパティに指定した型が持つ、データ取得に使用するメソッドの名前を指定します

 また、SelectParameters要素にはSelectMethodプロパティで指定したメソッドのパラメーターをどのように設定するか指定します。今回の例では、場所名にテキストボックスの入力値を使うよう設定しています。

(2)GridViewコントロールのプロパティ

 それぞれのプロパティは次のように設定します。

GridViewコントロールのプロパティ
プロパティ名 設定値 説明
DataSourceID LocationObjectDataSource バインドしたいデータソースコントロールのIDを指定します
DataKeyNames LocationId バインドするデータのキーとなる項目の名前を指定します

 GridViewコントロールの[選択]ボタンをクリックした際の処理は、Location.aspx.cs側に次のように記載します。

リスト8 Location.aspx.cs
  protected void LocationsGridView_SelectedIndexChanged(object sender, EventArgs e)
  {
    var locationId = (int)LocationsGridView.SelectedDataKey["LocationId"];  // (1)
    var url = String.Format("~/LocationsDetail.aspx?locationId={0}", locationId);
    Response.Redirect(url);
  }
(1)選択したデータのキー情報を取得する

 リスト7のGridViewコントロールのDataKeyNamesプロパティに指定した項目がSelectedDataKeyプロパティを使って取得できますので、今回はLocationIdを取得し、場所変更画面へのパラメータとしています。

[2]場所編集画面を作成する

 次は場所編集画面を作成しましょう。LocationDetail.aspxファイルを作成し、ObjectDataSourceコントロールとFormViewコントロールを次のように配置します。

リスト9 LocationDetail.aspx
<!-- (1) -->
<asp:ObjectDataSource ID="LocationsObjectDataSource" runat="server"
  TypeName="MRRS.BLL.LocationLogic" DataObjectTypeName="MRRS.Entity.Location"
  SelectMethod="Find" UpdateMethod="Update" DeleteMethod="Delete">
  <SelectParameters>
    <asp:QueryStringParameter DefaultValue="" Name="locationId"
      QueryStringField="locationId" Type="Int32" />
  </SelectParameters>
</asp:ObjectDataSource>
<!-- (2) -->
<asp:FormView ID="LocationsFormView" runat="server"
  DataSourceID="LocationsObjectDataSource" DataKeyNames="LocationId"
  DefaultMode="Edit" onitemdeleted="LocationsFormView_ItemDeleted"
  onitemupdated="LocationsFormView_ItemUpdated">
  <EditItemTemplate>
    <p>
      場所名 :
      <asp:TextBox ID="LocationNameTextBox" runat="server"
        Text='<%# Bind("LocationName") %>' />
    </p>
    <asp:Button ID="UpdateButton" runat="server"
      CausesValidation="True" CommandName="Update" Text="更新" />
    <asp:Button ID="DeleteButton" runat="server"
      CausesValidation="False" CommandName="Delete" Text="削除" />
  </EditItemTemplate>
</asp:FormView>
(1)ObjectDataSourceコントロールのプロパティ

 リスト7と同じように設定します。ただ、今回はSelectMethodプロパティは"Find"とし、前画面でパラメーターに設定したLocationIdを条件に、編集対象データのみ取得しています。

(2)FormViewコントロールのプロパティ

 リスト7のGridViewコントロールとほぼ同じように設定します。

 なお、Bindメソッドを使うことで、画面の入力値が自動でデータソース(今回はObjectdataSourceコントロールを介して取得した場所データ)に反映されます。

 また、DataKeyNamesプロパティに設定した項目は、ObjectDataSourceのUpdateMethodプロパティやDeleteMethodプロパティで指定したロジックメソッドを呼び出す際、その引数であるLocationオブジェクトに自動的に設定されます。DataKeyNamesプロパティを設定しないと、FormView内にキー情報に対応する項目が存在しないため、キー行項目がnullのLocationオブジェクトが渡されてしまい、更新処理、削除処理が失敗してしまいます。

[3]場所新規登録画面を作成する

 場所新規登録画面は場所編集画面とほぼ同様の手順で作成できます。サンプルを元に作成してみてください。

 これで完成です。実行して動作を確認してみてください。

まとめ

 前回から2回に渡って解説してきたポイントは、以下のとおりです。

  • ASP.NET Webフォームアプリケーションは少ないコードを元に自動生成を行うため、決まったパターンが頻出する業務アプリケーションに向いている。
  • データバインドには直接データアクセスを行うデータソースコントロールを用いたプレゼンテーション層とデータ層の二層で構成する「二層データバインド」と、ObjectDataSourceコントロール用いて、プレゼンテーション層、ロジック層、データ層の三層で構成する「三層データバインド」がある。
  • 二層データバインドはプレゼンテーション層にビジネスロジックが混入するため、開発効率、保守性が低下する。
  • 業務アプリケーションでは、ビジネスロジックをプレゼンテーション層から分離させるため、三層データバインドを用いるべきである。
  • ロジック層はデータアクセス処理を行うデータアクセス層と、ビジネスルールを実装するビジネスロジック層にさらに分割する。
  • データアクセス層にはリポジトリパターンを用いることで、データアクセステクノロジーの変更に強くなる。また、モックを用いてビジネスロジック層に対するコードによるユニットテストを行うことも容易になる。

 今回は長くなるため場所についてだけメンテナンス画面を作成しましたが、同じような手順で会議室のメンテナンス画面も作成できます。実際の作成作業は読者の皆さんへの宿題としますが、会議室には場所の情報も含んでいますので、そこをどのように実装するか、いろいろと試してみてください。

 さて、次回はASP.NET Webフォームアプリケーションのエラー処理について、エラーをどのように分類し、その種類ごとにどのように対処すればよいのか解説していく予定です。お楽しみに。

修正履歴

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
実例で学ぶASP.NET Webフォーム業務アプリケーション開発のポイント連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 高野 将(タカノ ショウ)

<個人紹介>新潟県長岡市在住の在宅リモートワークプログラマー。家事や育児、仕事の合間に長岡IT開発者勉強会(NDS)、Niigata.NET、TDDBCなどのコミュニティに関わったり、Web記事や書籍などの執筆を行ったりしている。著書に『アプリを作ろう! Visual C#入門 Visual C# 2017対応』(日経BP社、2017)など。<WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/6498 2013/07/17 17:45

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング