連載:ASP.NET MVC入門【バージョン3対応】

第1回 Controller−View開発のキモを押さえる

山田 祥寛(http://www.wings.msn.to/
2011/03/25
Page1 Page2 Page3

■コントローラ・クラスを作成する

 プロジェクトの構造を理解できたら、ここからが本番だ。まずはModel−View−ControllerのController(コントローラ・クラス)を作成する。前回も述べたように、コントローラ・クラスとは、個々のリクエストに応じた処理を行うクラスのことである。

 コントローラ・クラスを作成するには、ソリューション・エクスプローラから/Controllersフォルダを右クリックし、コンテキスト・メニューから[追加]−[コントローラー]を選択すればよい*3

*3 ほかのファイルと同じく、[新しい項目の追加]ダイアログから追加しても構わない。その場合は、テンプレートとして「MVC 3 コントローラー クラス」を選ぶ。


図10 [コントローラーの追加]ダイアログ

 [コントローラーの追加]ダイアログが表示されるので、[コントローラー名]欄でコントローラ・クラスの名前を指定する。

 コントローラ・クラスの名前は必ず「Controller」で終わらなければならない点に要注意だ。ASP.NET MVCでは、クラス名から接尾辞を取り除いた部分をコントローラ名であると認識する。つまり、ここでは「HelloController」としているので、コントローラ名は「Hello」と見なされる。

 [Create、Update、Delete、およびDetailsの各シナリオのアクション・メソッドを追加する]のチェックは、登録/更新/一覧/削除/詳細などの機能を持ったメソッドのひな形を作成するかを指定する項目である。ひな形を作成する詳細についてはあらためて次回以降に解説するので、ここではチェックせずにおく。

 [追加]ボタンをクリックすると、HelloController.vb/HelloController.csがコード・エディタで開く。エディタではすでにコントローラ・クラス(Controller派生クラス)の骨組みができているはずなので、リスト1のように必要なコードを追加してみよう(追記部分は太字)。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MvcApp.Controllers
{
  public class HelloController : Controller
  {
    //
    // GET: /Hello/

    public ActionResult Index()
    {
      ViewBag.Message = "こんにちは、世界!";
      return View();
    }
  }
}
Namespace MvcAppVb
  Public Class HelloController
    Inherits System.Web.Mvc.Controller

    '
    ' GET: /Hello

    Function Index() As ActionResult
      ViewBag.Message = "こんにちは、世界!"
      Return View()
    End Function
  End Class
End Namespace
リスト1 HelloコントローラにIndexアクションを追加するコード(上:HelloController.cs、下:HelloController.vb)

 以下に、コントローラ・クラスのポイントをまとめておく。

(1)実際の処理を記述するのはアクション・メソッド

 コントローラ・クラスには、1つ以上のアクション(アクション・メソッド)を含むことができる。アクション・メソッドとは、クライアントからのリクエストに対して具体的な処理を行うためのメソッドだ。

 ASP.NET MVCでは、コントローラ・クラス配下のパブリック・メソッドを無条件にアクション・メソッドと見なすので*4、ことさらに命名規則を意識する必要はない。サンプルのコードであればIndexアクションを定義したという意味になる。

*4 逆に、アクション・メソッドとして扱ってほしくない場合には、メソッドをNonAction属性(System.Web.Mvc名前空間)でマークする必要がある。

(2)ビュー変数を設定する

 コントローラ(アクション)の役割は多岐にわたっており、リクエスト情報の加工やモデルの呼び出しなど仕事はさまざまであるが、まずは最低限、ビューの生成に必要なパラメータ(ビュー変数)の設定だけを行っておく。ビュー変数とは、「コントローラとビューとの間で受け渡しできる変数」である、と考えておけばよい。

 ビュー変数を設定するには、以下の構文で行える。

ViewBag.変数名 = 値

 このように、ビュー変数はViewBagオブジェクトのプロパティとして設定できるわけだ。変数名は、Visual Basic/C#の命名規則に沿う限り、自由に命名して構わない。ここではMessageという名前で「こんにちは、世界!」という文字列を設定しているが、もちろん、同じ要領で複数のプロパティを設定することも可能であるし、値にも(文字列だけでなく)数値や日付、任意のオブジェクトを指定できる*5

*5 ViewBagオブジェクトはバージョン3からの新機能。従来は、同じ目的で「ViewData["msg"] = "……";」のようなコードを記述していたが、ViewBagオブジェクトによって、わずかながらすっきりとした記述が可能になった。

 なお、ViewBagオブジェクトを利用する際に1点だけ注意すべき点がある。というのも、ViewBagオブジェクトは.NET Framework 4のdynamicサポートを利用しているため(メンバは実行時に解決される)、プロパティの入力に当たってはIntelliSenseの恩恵を受けられ“ない”という点だ。注意してほしい。

(3)アクションの結果はActionResultオブジェクトで表す

 ビュー変数を設定したら、アクション・メソッドの戻り値としてActionResultオブジェクト(正確には、その派生オブジェクト)を返すだけだ。ActionResultオブジェクトは、アクションの結果を表すためのオブジェクトで、ASP.NET MVCでは、ここで指定された内容に応じて出力を生成することになる。

 ActionResultオブジェクトは、Controllerクラスで用意されたヘルパー・メソッドによって取得できる。リスト1で利用している「Viewメソッド」はその中でも特によく利用するメソッドで、アクションの結果を、ビュー・スクリプトを使って出力することを表している。

 ちなみに、ActionResultオブジェクトを取得するためのヘルパー・メソッドには、以下のようなものが用意されている(*はASP.NET MVC 3で新たに追加されたもの)。

ヘルパー・メソッド 概要
View([name] [,model]) ビューnameを使って出力を生成
PartialView([name] [,model]) 部分ビューnameを使って出力を生成
Content(c [,type [,enc]) 指定されたテキストcを出力(encは文字エンコーディング)
File(c, type [,name]) 指定されたバイナリ・データを出力(nameはダウンロード時のファイル名)
Json(data [,type [,enc]] [,behavior]) 指定されたオブジェクトdataをJSONデータとして出力(behaviorはHTTP GET要求を許可するか)
JavaScript(scr) 指定されたテキストscrをJavaScriptとして出力
Redirect(url) 指定されたURLにリダイレクト
*RedirectPermanent(url) 指定されたURLにリダイレクト。301 Moved Permanently対応
RedirectToAction(action [,ctrl] [,values]) 指定されたアクションactionにリダイレクト(ctrlはコントローラ名、valuesはルート・パラメータ)
*RedirectToActionPermanent(action [,ctrl] [,values]) 指定されたアクションactionにリダイレクト(ctrlはコントローラ名)。301 Moved Permanently対応
RedirectToRoute([name] [,values]) 指定されたルート・パラメータに従ってリダイレクト(nameはルート名)
*RedirectToRoutePermanent([name] [,values]) 指定されたルート・パラメータに従ってリダイレクト(nameはルート名)
*HttpNotFound() 「404 Not Found」ステータスを出力
表2 ActionResultオブジェクトを取得するためのヘルパー・メソッド
・model:ビューに渡すモデル
・type:コンテンツ・タイプ
・enc:文字エンコーディング

 さまざまなメソッドが用意されているが、(もちろん)いまここですべてを覚え込む必要はない。まずは「こんなものがあるんだ」という程度に確認いただければよいし、実際、当面利用するメソッドもせいぜいView、Redirect、Content程度であると考えておけばよいだろう。詳細は、拙稿「ActionResultオブジェクトでアクション操作も自由自在」も参照いただきたい。


 INDEX
  ASP.NET MVC入門【バージョン3対応】
  第1回 Controller−View開発のキモを押さえる
    1.ASP.NET MVC 3を利用するための準備/Hello, Worldアプリを作成
  2.コントローラ・クラスを作成する
    3.ビューを作成する/サンプルの実行/まとめ
 
インデックス・ページヘ  「ASP.NET MVC入門【バージョン3対応】」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間