プレゼンテーション層の作成
最後にプレゼンテーション層となるWebサイトを作成していきましょう。
[1]場所検索画面を作成する
まずは場所検索画面です。Location.aspxファイルを作成し、検索条件とObjectDataSourceコントロール、GridViewコントロールを次のように配置します。
なお、紙面の都合上、以後のソースはポイントとなる部分を抜粋して掲載します。ソースのすべてを見たい場合は、サンプルを確認してください。
<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コントロールのプロパティ
それぞれのプロパティは次のように設定します。
プロパティ名 | 設定値 | 説明 |
TypeName | MRRS.BLL.LocationLogic | データアクセスに使う型名を指定します |
DataObjectTypeName | MRRS.Entity.Location | 取得するデータの型名を指定します(複数項目ある場合は","で区切る) |
SelectMethod | Select | TypeNameプロパティに指定した型が持つ、データ取得に使用するメソッドの名前を指定します |
また、SelectParameters要素にはSelectMethodプロパティで指定したメソッドのパラメーターをどのように設定するか指定します。今回の例では、場所名にテキストボックスの入力値を使うよう設定しています。
(2)GridViewコントロールのプロパティ
それぞれのプロパティは次のように設定します。
プロパティ名 | 設定値 | 説明 |
DataSourceID | LocationObjectDataSource | バインドしたいデータソースコントロールのIDを指定します |
DataKeyNames | LocationId | バインドするデータのキーとなる項目の名前を指定します |
GridViewコントロールの[選択]ボタンをクリックした際の処理は、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コントロールを次のように配置します。
<!-- (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フォームアプリケーションのエラー処理について、エラーをどのように分類し、その種類ごとにどのように対処すればよいのか解説していく予定です。お楽しみに。