ルーティング

最近のWebアプリケーションでは、「Cool URI」と呼ばれるURLの設計を採用しているものが多い。Cool URIとは、たとえば「書籍情報を表示するページ」において、「idが123の書籍情報を表示する」という場合であれば、「http://www.example.com/bookinfo?bookid=123」という形式ではなく、「http://www.example.com/bookinfo/123」という形式にする、というものだ。このようなCool URIを意識したルーティング処理は、もちろん従来のASP.NETでも実現できるのだが、ASP.NET MVCでは、非常に簡単に実現できるようになっている。

それではASP.NET MVCでルーティング処理を実装する方法を見ていくことにする。

先ほど作成したばかりのASP.NET MVC Webアプリケーションを実行し、表示されたトップページの右上にある「About」というリンクをクリックしてみよう。Aboutのページに遷移し、Webページの内容が表示されるはずだ。ここでURLを見てみると「http://localhost:1234/Home/About」というURLになっていることが分かる。

今行われた処理の流れを追ってみるために、「/Controllers/HomeController.cs」を見てみると、次のようなコードになっている。

[HandleError]
public class HomeController : Controller
{
    public ActionResult Index()
    {
        ViewData["Message"] = "Welcome to ASP.NET MVC!";

        return View();
    }

    public ActionResult About()
    {
        return View();
    }
}

「/Home/About」というURLにアクセスされたときに行われた処理は、HomeControllerクラスのAboutメソッドが呼び出され、そこから「/View/Home/About.aspx」を使用してページの描画がなされた、という流れになっている。

つまり、ASP.NET MVCの標準的な設定では、URLによってリクエストを処理するControllerクラスとメソッドが決定される仕組みになっているわけだ。そして、ControllerクラスとViewは一対多になっていて、呼び出されたControllerクラスのメソッドによって、呼び出すViewが決定される。「どのControllerクラスのどのメソッドが呼び出されるのか」は、リフレクションを用いて解決されるため、設定ファイルにルーティング情報を記述したりする必要はない。また、Controllerのメソッドから呼び出されるViewも、明示的に指定されない限りは命名規則から自動的に推測される。

こういった暗黙の規則が分かっていれば、「/Example/Hello」というURLで、「Hello World」を表示するページを作成することも容易だろう。まずExampleControllerクラスを追加し、そこにHelloメソッドを追加する。そして、「/View/Example/Hello.aspx」を追加すればよい、というわけである。

ちなみにControllerからViewにデータを渡すときの最もシンプルな方法は、ViewDataを使用することだ。たとえば、トップページを見てみると「Welcome to ASP.NET MVC!」というメッセージが表示されているが、このメッセージの文字列は「/Controllers/HomeController.cs」のコードの中で記述されている。具体的には次の箇所だ。

ViewData["Message"] = "Welcome to ASP.NET MVC!";

そして、ControllerのViewDataに渡された文字列は、Viewで取得することができる。具体的には、「/Views/Home/Index.aspx」の次の箇所だ。

<%= Html.Encode(ViewData["Message"]) %>

ModelをベースとしてControllerとViewを連携させる方法もあるが、とりあえずはViewDataから試してみるとよいだろう。