ViewPageの追記と追加
Controllerから2種類のページを指定していますが、最初にPublisherページの追記から行います。Hello
メソッドと違い、Titles
メソッドはLINQ to SQLを利用したデータをViewDataに格納しました。このViewDataの値をViewPage上で利用するためにテーブルの型を紐付けます。
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
クラスの主要メンバを記述します。
メソッド | 概要 |
ActionLink | 同一ルート内のハイパーリンクを生成 |
DropDownList | ドロップダウンリストを生成 |
Encode | エンコードされた文字列を生成 |
ListBox | リストボックスを生成 |
Password | パスワードテキストボックスを生成 |
RouteLink | 異なるルートへのハイパーリンクを生成 |
TextBox | テキストボックスを生成 |
それぞれパラメタを指定するだけで、HTMLタグを生成するので積極的に活用しましょう。
それでは、Publisherページ上でデータを表示するためのコードを記述します。
<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)。
続いて「TitleView.aspx」というMVC View Content Pageを「Pubs」フォルダ上に追加します。Publisherページのコードビハインド同様、こちらもテーブルの紐付けを忘れずに行ってください。
<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)。
パラメタを持つViewPageの追記と追加
ASP.NET MVCのルーティングルールで、[action]以降にパラメタを記述している場合、既定でその名前のパラメタとして扱われます。今回は/[controller]/[action]/[id]というルーティングルールを登録しているので、id部分のパラメタをaction
メソッドのパラメタとして利用できます。この時ルーティングルールで設定したパラメタ名と一致しない場合は、メソッドはパラメタを渡すことはできません。
ここでは、titles
メソッドで表示されたTitleViewページのTitle IDをハイパーリンクに変換し、詳細ページ(details.aspx)にルーティングを行います(図13~14)。
// 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」は次のように記述してください。
<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に変換するだけです。
<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)。