SHOEISHA iD

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

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

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

もう一つのASP.NET 「ASP.NET MVC」を知る(前編)

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


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

ViewPageの追記と追加

 Controllerから2種類のページを指定していますが、最初にPublisherページの追記から行います。Helloメソッドと違い、TitlesメソッドはLINQ to SQLを利用したデータをViewDataに格納しました。このViewDataの値をViewPage上で利用するためにテーブルの型を紐付けます。

Publisher.aspx.cs の一部
using SampleMVC.Models;

namespace SampleMVC.Views.Pubs
{
    public partial class Publisher : ViewPage<List<title>>
    {
    }
}

 これで、データの紐付けもできました。しかし、現在のPreview 3では紐付けた後に一度ビルドを行う必要があるので、忘れずにビルドを行ってください。

HtmlHelperクラス

 ASP.NET MVCでは、Viewページを作る際に反復処理か、MVCに関する知識が求められます。また、サーバーコントロールも利用できないので、少しでもHTMLを簡単に書くために、HtmlHelperクラスが用意されています。ViewPage上で利用可能なので積極的に利用してください。以下にPreview 3のHtmlHelperクラスの主要メンバを記述します。

HtmlHelperクラスメンバ
メソッド 概要
ActionLink 同一ルート内のハイパーリンクを生成
DropDownList ドロップダウンリストを生成
Encode エンコードされた文字列を生成
ListBox リストボックスを生成
Password パスワードテキストボックスを生成
RouteLink 異なるルートへのハイパーリンクを生成
TextBox テキストボックスを生成

 それぞれパラメタを指定するだけで、HTMLタグを生成するので積極的に活用しましょう。

 それでは、Publisherページ上でデータを表示するためのコードを記述します。

Publisher.aspxの一部
<h1><%=ViewData["Hello"] %></h1>
<p></p>
<hr />
<p></p>
<% if (ViewData.Model != null)
   {%>
<h2>Title Only</h2>
<ul>
    <% foreach (var data in ViewData.Model)
       { %>
    <li>
        <%=Html.Encode(data.title1)%>
    </li>
    <% } %>
</ul>
<% } %>

 初回実行時にPublisherページにアクセスしても、ViewData.Modelは空なのでデータは表示されません。しかし、Titlesメソッドからアクセスされた場合にはデータが表示されるようになります。また、埋め込みコードにより、ViewDataが持つデータの数だけforeach文で繰り返すことができます。foreach文はASP.NET MVCでは多用することになるので、この雰囲気はしっかりと掴みましょう。実行した画面はこちらです(図11)。

図11 Titlesメソッドを経由したPublisherページ
図11 Titlesメソッドを経由したPublisherページ

 続いて「TitleView.aspx」というMVC View Content Pageを「Pubs」フォルダ上に追加します。Publisherページのコードビハインド同様、こちらもテーブルの紐付けを忘れずに行ってください。

TitleView.aspxの一部
<h1>Title View</h1>
<p></p>
<hr />
<p></p>
<table>
    <thead>
        <tr>
            <td>Title ID:</td>
            <td>Title:</td>
            <td>Type:</td>
            <td>Price:</td>
        </tr>
    </thead>
    <% foreach (var data in ViewData.Model){ %>
    <tr>
        <td>
            <%=Html. Encode (data.title_id) %>
        </td>
        <td>
            <%=Html.Encode(data.title1) %>
        </td>
        <td>
            <%=Html.Encode(data.type) %>
        </td>
        <td>
            <%=Html.Encode(data.price) %>
        </td>
    </tr>
    <% } %>
</table>

 実行した画面はこちらです(図12)。

図12 titleメソッドを経由したTitleViewページ
図12 titleメソッドを経由したTitleViewページ

パラメタを持つViewPageの追記と追加

 ASP.NET MVCのルーティングルールで、[action]以降にパラメタを記述している場合、既定でその名前のパラメタとして扱われます。今回は/[controller]/[action]/[id]というルーティングルールを登録しているので、id部分のパラメタをactionメソッドのパラメタとして利用できます。この時ルーティングルールで設定したパラメタ名と一致しない場合は、メソッドはパラメタを渡すことはできません。

 ここでは、titlesメソッドで表示されたTitleViewページのTitle IDをハイパーリンクに変換し、詳細ページ(details.aspx)にルーティングを行います(図13~14)。

図13 Title IDをハイパーリンクに変換したTitleViewページ
図13 Title IDをハイパーリンクに変換したTitleViewページ
図14 Title IDクリック後にルーティングされたdetailsページ
図14 Title IDクリック後にルーティングされたdetailsページ
PubsController.cs の一部

// URLはhttp://xxx/Pubs/info/id
public ActionResult info(string id)
{
    // titlesテーブルの中からtitle_idがパラメタのidと同等の項目を取得
    var pubs = from t in pubsdatacontext.titles
               where t.title_id == id
               select t;

    // ブラウザのタイトルにパラメタの表示を行う
    ViewData["Title"] = "Information :"+id;

    // details.aspxページに上記のLINQ結果をパラメタとしてルーティング
    return View("details", pubs.ToList());
}

 続いて「details.aspx」というMVC View Content Pageを「Pubs」フォルダ上に追加し、テーブルの紐付けを忘れずに行います。「Details.aspx」は次のように記述してください。

details.aspxの一部
<h1><%=Html.Encode(ViewData["Title"]) %></h1>
<p></p>
<hr />
<p></p>
<table>
    <% foreach(var Data in ViewData.Model){ %>
    <tr>
        <td>Title_ID</td>
        <td>
            <%=Html.Encode(Data.title_id) %>
        </td>
    </tr>
    <tr>
        <td>Title</td>
        <td>
            <%=Html.Encode(Data.title1) %>
        </td>
    </tr>
    <tr>
        <td>PubDate</td>
        <td>
            <%=Html.Encode(Data.pubdate) %>
        </td>
    </tr>
    <% } %>
    <tr>
        <td colspan="2">
            <%-- ActionLinkは第一パラメタに表示テキストを、
                 第二パラメタにリンク先を記述します --%>
            <%=Html.ActionLink("戻る", "title") %>
        </td>
    </tr>
</table>

 以上で「details.aspx」は完成です。後は、TitleViewページのTitle IDをActionLinkに変換するだけです。

TitleView.aspxの一部
<td>
    <%=Html.ActionLink(data.title_id, "info/" + data.title_id)%>
</td>

 実行結果は図13~14になります。

まとめ

 ASP.NET MVCフレームワークは従来のASP.NET開発とはまったく異なるので、ASP.NETでしか開発をしたことがない方にとっては、ASP.NET AJAXのように気軽に体感できない分、非常にハードルの高いフレームワークだと感じてしまうかと思います。しかし、キモの部分やコツさえ掴んでしまえば魅力的なフレームワークになるのは間違いありません。正式リリース前にどのような物か実際にチュートリアル通りにプロジェクトを作成し、予習しておくとよいでしょう。

 今回は、前半としてデータを利用したMVCアプリケーション作成までを解説しました。次回は、MVCアプリケーションのテスト方法や、ページ編集やフィルタ作成といった踏み込んだMVCアプリケーションの作成について解説したいと思います。

 なお、ASP.NET AJAXがBetaから正式版にかけてさまざまな変更点があったように、ASP.NET MVCフレームワークも変更点がある点には注意が必要です(現在はPreview 3)。

参考文献

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

  • 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/2748 2008/08/22 13:12

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング