自動生成されるList.aspxの中身
各種ページ、ユーザーコントロールは自動生成されるので、基本的な利用においてaspxファイルを修正する機会は中々ないかと思いますが、一番使うであろうList.aspxファイルだけ簡単に解説します。中身自体はDynamicDataコントロールと、ユーザーコントロールを使用しているところ以外、特筆すべき点はないので中略します。
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server"> <asp:DynamicDataManager ID="DynamicDataManager1" runat="server" AutoLoadForeignKeys="true" /> <h2><%= table.DisplayName%></h2> <asp:ScriptManagerProxy runat="server" ID="ScriptManagerProxy1" /> <asp:UpdatePanel ID="UpdatePanel1" runat="server"> <ContentTemplate> <asp:ValidationSummary ID="ValidationSummary1" runat="server" EnableClientScript="true" HeaderText="検証エラーの一覧" /> <asp:DynamicValidator runat="server" ID="GridViewValidator" ControlToValidate="GridView1" Display="None" /> <%--表示されたテーブルにフィルタが適用できる時に表示されるコントロール--%> <asp:FilterRepeater ID="FilterRepeater" runat="server"> <ItemTemplate> <asp:Label runat="server" Text='<%# Eval("DisplayName") %>' AssociatedControlID="DynamicFilter$DropDownList1" /> <%--フィルタを掛けるためにDropDownListに項目をバインディングさせるユーザーコントロール--%> <asp:DynamicFilter runat="server" ID="DynamicFilter" OnSelectedIndexChanged="OnFilterSelectedIndexChanged" /> </ItemTemplate> <FooterTemplate><br /><br /></FooterTemplate> </asp:FilterRepeater> <asp:GridView ID="GridView1" runat="server" DataSourceID="GridDataSource" AllowPaging="True" AllowSorting="True" CssClass="gridview"> <Columns> <asp:TemplateField> <ItemTemplate> <%--URLは"テーブル名/Edit.aspx?主キーのクエリ文字列/"--%> <asp:HyperLink ID="EditHyperLink" runat="server" NavigateUrl='<%# table.GetActionPath(PageAction.Edit, GetDataItem()) %>' Text="編集" /> <asp:LinkButton ID="DeleteLinkButton" runat="server" CommandName="Delete" CausesValidation="false" Text="削除" OnClientClick='return confirm("Are you sure you want to delete this item?");' /> <%--URLは"テーブル名/Details.aspx?主キーのクエリ文字列"--%> <asp:HyperLink ID="DetailsHyperLink" runat="server" NavigateUrl='<%# table.GetActionPath(PageAction.Details, GetDataItem()) %>' Text="詳細" /> </ItemTemplate> </asp:TemplateField> </Columns> <PagerStyle CssClass="footer" /> <PagerTemplate> <%--GridViewのページ部分を受け持つユーザーコントロール--%> <asp:GridViewPager runat="server" /> </PagerTemplate> <EmptyDataTemplate> 現在、このテーブルに項目はありません。 </EmptyDataTemplate> </asp:GridView> <asp:LinqDataSource ID="GridDataSource" runat="server" EnableDelete="true"> <%--Where句で使われるパラメータのコレクション--%> <WhereParameters> <%--LinqDataSourceコントロールがFilterRepeaterコントロールのパラメタを利用する--%> <asp:DynamicControlParameter ControlID="FilterRepeater" /> </WhereParameters> </asp:LinqDataSource> <中略> </ContentTemplate> </asp:UpdatePanel> </asp:Content>
ご覧の通りDynamic Dataは表示側のUIを構築済みなので、データに対するメタデータ(フォーマットや検証コントロールの設定)を定義して利用することが重要です。
Modelフォルダの設定
プロジェクト作成直後に実行しても、データの設定が行われていないのでエラー画面が表示されるだけです。Dynamic Dataでは、既定でModelフォルダは作成されないので、Modelフォルダを作成し、そこにデータモデルの作成をします。
ソリューションエクスプローラ上で、Modelフォルダを作成後、[新しい項目の追加]を選択して、[LINQ to SQLクラス]-「Pubs.dbml」と名前を付けて追加します。サーバーエクスプローラからjobs/employee/titles/publisherテーブルをドラッグしてデザイン画面へとドロップし、保存します。
以上で、テーブルの定義は完了です。
Global.asax.vbの設定
ルーティング部分はどのデータモデルが追加されたかが自動で設定されません。Global.asax.vbファイル内に直接その設定を行います。
自動生成されるGlobal.asaxの中身
ルーティングの原理として、Webアプリケーション起動時に一度だけ呼び出されるGlobal.asax.vbのApplication_Start
メソッドからRegisterRoutes
メソッドを呼び出して、ルーティングルールをルートコレクションに追加しています。
Global.asax.vbファイルで、開発者が設定するのは、以下の3点だけです。
- コメントアウトされている部分のコメント解除
- 自動生成時に仮名が付けられているデータコンテキストの設定
- ScaffoldAllTablesプロパティのFalseをTrueに変更
Global.asax.vbには自動生成されるコードについて注意すべき点は、Dynamic Dataは既定で作られたルーティングを利用することが多くなるので、極力触れるべきではありません。今回触れる部分程度の記述で済ませてしまうのが理想です(もちろんDynamic Dataを深く理解している方がいろいろ修正するのは問題ありません)。
実際にGlobal.asax.vbファイルの設定を行う前に、ざっと自動生成されているソースの確認をしてみましょう。
コメントアウトされている部分は次項で解説します。
ルートコレクションにDynamic Dataで使用するURL、登録したデータモデル、Actionを追加する構文は次のとおりです(自動生成部分)。
簡単に解説すると、Dynamic Dataで利用するルートコレクションにDynamicDataRouteを追加しています。
DynamicDataRoute
メソッドで("{table}/{action}.aspx")というURLルートを用意します。そして、どのメタモデルをルートに追加するか({table}に適用させるか)の設定と、どのアクションを追加するか({action})の設定を行います。
アクション追加の部分が少し複雑です。RouteValueDictionary
メソッドでActionの要素の既定の値を設定し、Constraints
プロパティを使用してDynamicDataRoute
メソッドに設定します。
Public Shared Sub RegisterRoutes(ByVal routes As RouteCollection) Dim model As New MetaModel ' 作成時はコメントアウトされている ' 解説は次項 ' model.RegisterContext(GetType(YourDataContextType), New ContextConfiguration() With {.ScaffoldAllTables = False}) ' ルートコレクションに、Dynamic Dataで使用するルートを追加します。 ' DynamicDataRouteメソッドは4つのアクションと、メタモデルを設定 routes.Add(New DynamicDataRoute("{table}/{action}.aspx") With { _ .Constraints = New RouteValueDictionary(New With {.Action = "List|Details|Edit|Insert"}), _ .Model = model}) End Sub
データモデルの登録
前項では自動生成部分の解説となりましたが、本項ではコメントアウトされていた部分の構文の設定。つまり、Global.asax.vbファイルで開発者が設定を行う部分について解説します。
コメントアウトされていた部分は、メタモデルにLINQ to SQLクラスで生成されたデータコンテキストと、そのテーブルの表示を設定を登録するという記述がされていました。ScaffoldAllTables
プロパティがFalseの場合、データコンテキストが登録されてもデータを表示することはできず、実行時エラーが発生します。
ここでは、前述のようにコメントアウトの解除、データコンテキストの設定(サンプルではPubsDataContext)、ScaffoldAllTables
プロパティのFalseをTrueに変更します。
Dim model As New MetaModel ' PubsDataContextのテーブルの値をすべて表示させるために ' ScaffoldAllTablesプロパティをtrueに設定し、MetaModelに登録する model.RegisterContext(GetType(PubsDataContext), New ContextConfiguration() With {.ScaffoldAllTables = True})
以上で、Dynamic Dataを実行するための設定は完了です。
実行結果は図4~8の通りです。ご覧の通り、わずかな労力で簡単なデータドリブンアプリケーションが作成できました。