SHOEISHA iD

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

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

ASP.NET 3.5 Extensions + ASP.NET MVCフレームワーク

簡単なデータ編集はお任せ!
ASP.NET Dynamic Dataアプリケーション

ASP.NET 3.5 Extensions + ASP.NET MVCフレームワーク(3)

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

自動生成されるList.aspxの中身

 各種ページ、ユーザーコントロールは自動生成されるので、基本的な利用においてaspxファイルを修正する機会は中々ないかと思いますが、一番使うであろうList.aspxファイルだけ簡単に解説します。中身自体はDynamicDataコントロールと、ユーザーコントロールを使用しているところ以外、特筆すべき点はないので中略します。

List.aspxの一部
<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="編集"                       />
                            &nbsp;
                            <asp:LinkButton ID="DeleteLinkButton" runat="server" CommandName="Delete" CausesValidation="false" Text="削除" OnClientClick='return confirm("Are you sure you want to delete this item?");'                       />
                            &nbsp;
                            <%--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は極力触れるべきではない?

 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メソッドに設定します。

Global.asax.vbの一部
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に変更します。

Global.asax.vbの一部
Dim model As New MetaModel

    ' PubsDataContextのテーブルの値をすべて表示させるために
    ' ScaffoldAllTablesプロパティをtrueに設定し、MetaModelに登録する
    model.RegisterContext(GetType(PubsDataContext), New ContextConfiguration() With {.ScaffoldAllTables = True})

 以上で、Dynamic Dataを実行するための設定は完了です。

 実行結果は図4~8の通りです。ご覧の通り、わずかな労力で簡単なデータドリブンアプリケーションが作成できました。

次のページ
メタデータの編集とカスタマイズページの利用方法

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

  • X ポスト
  • このエントリーをはてなブックマークに追加
ASP.NET 3.5 Extensions + ASP.NET MVCフレームワーク連載記事一覧

もっと読む

この記事の著者

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

静岡県榛原町生まれ。一橋大学経済学部卒業後、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プロジェクト ナオキ(ナオキ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

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

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

この記事をシェア

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

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング