ASP.NET MVC を もっと 使 ってみたよ! しばやん
注 意! 前 回 のLTを 聞 いてる 人 には 繰 り 返 しになるか も 知 れない 聞 いてなかったふりのご 協 力 を 前 で 喋 ってる 人 間 はまだ 勉 強 中 です 間 違 いもあると 思 いますが 見 つけたときは やさしく 教 えてあげてください
ASP.NET MVC とは ASP.NET 4.0 で 入 る 予 定 のフレームワーク AJAX と 同 じく 単 体 で 先 行 リリースされました Web Form とは 違 い HTML (+ CSS と JS) を 書 かないとだめ ぽとぺたで 出 来 るわけ 無 い より Web の 知 識 が 要 求 されます 構 成 要 素 が 分 離 されていてわかりやすい テストが 容 易 TDDについては 今 回 説 明 しません
MVC ってなによ? Model View Controller の 略 モデル: DB からデータ 引 っ 張 ってきたりする ビュー: 最 終 的 に 表 示 するもの コントローラ: うまいことモデルとビューをつなぎ 合 わせる ASP.NET MVC が 提 供 するのは V と C Model は LINQ to SQL など
ルーティング ASP.NET MVC の 構 造 は? 定 義 に 従 いコントローラとアクションを 決 定 する コントローラ アクションを 持 つクラス モデルからデータ 持 ってきたり ビューを 呼 んだり ビュー 最 終 的 に 出 力 される HTML ASP.NET MVC では aspx と ascx になります
ASP.NET MVC の 仕 組 みは? ルーティングエンジン が URI からコントローラとアクションを 決 定 する デフォルトでは /{controller}/{action}/{id} 決 定 されたコントローラクラスをインスタンス 化 し アクションメ ソッドを 呼 び 出 す アクションの 引 数 はルーティングで 指 定 したパラメータと URI のクエリ パラメータと 対 応 する アクション 内 で DB からデータ 引 っ 張 ってきたりして ビューに 引 き 渡 したりリダイレクトしたり ビュー (aspx や ascx) 内 でデータを 展 開 する レスポンスとして 返 す
ルーティング デフォルトは /{controller}/{action}/{id} /users/details/shiba-yan は controller = users action = details id = shiba-yan になる この 場 合 だと UsersController.Details(string id) が 呼 ばれる デフォルト 値 や 条 件 なども 指 定 できる デフォルトの 定 義 では / の 時 は HomeController.Index が 呼 ばれる id は 数 値 のみ といった 条 件 を 正 規 表 現 で 書 けます ちなみに case-insensitive です
ルーティングを 定 義 する MapRoute を 使 います MVC FW で 定 義 された 拡 張 メソッド 結 構 面 倒 なルーティングを 楽 に 追 加 できます 基 本 は MapRoute( 名 前,URLパターン) デフォルト 値 や 条 件 を 指 定 できるメソッドも 用 意 さ れてます
規 約 があります コントローラ(とアクション) Controllers ディレクトリ 内 の コントローラ 名 + Controller が 対 象 になる つまり Users + Controller = UsersController 当 然 ながらコントローラクラスとアクションメソ ッドは public で リフレクション 使 って 呼 び 出 している はず VS に 作 ってもらうのが 基 本 です
ActionResult アクションは ActionResult を 継 承 したクラス を 返 すようにしないとだめです return View(); は ViewResult を 作 成 して 返 して います ビュー 以 外 にリダイレクトやファイルなど 返 し たいときはどうするん? View メソッド 以 外 にも File/Redirect/Json/JavaScript/Content メソッド などが 用 意 されてます 意 味 は 名 前 から 読 み 取 ってください
ASP.NET MVC と 属 性 コントローラやアクションには 属 性 をつけるこ とが 出 来 ます <% OutputCache %> などは 使 いません で どんな 属 性 があるん? いろいろあるし 自 分 でも 作 れます 自 分 で 作 る 時 は ActionFilterAttribute を 継 承 これ 以 上 は 説 明 しません では 基 本 的 な 属 性 の 紹 介 始 まり
AcceptVerbs 属 性 (1) 受 け 入 れる HTTP メソッドを 制 限 する ActionName アクション 名 を 指 定 する Authorize 認 証 が 必 要 にする HandleError 例 外 をハンドリングする 捕 まえる 例 外 や 表 示 するビューを 指 定 できる
OutputCache 属 性 (2) 出 力 キャッシュを 設 定 する ValidateAntiForgeryToken CSRF 対 策 で 埋 め 込 んだトークンを 検 証 する Html.AntiForgeryToken と 併 用 する 必 要 があり ます ValidateInput 危 険 な 文 字 列 の 混 入 を 検 証 するか 指 定 する などなどあります
モデル LINQ to SQL や Entity Framework を 使 うの が 定 石 海 外 だと Entity Framework 使 ってる 例 が 多 いで すね 今 のバージョンは 超 絶 使 いにくいです MS 先 生 の 次 のバージョンに 期 待 しましょう テストのことを 考 えると Repository で コントローラに DataContext や Entities を 書 くの はやばい
モデルバインダ controller と action 以 外 のパラメータの 型 は アクションの 引 数 の 型 に 自 動 的 に 変 換 される Nullable<T> 使 っても 平 気 便 利 すぎます 独 自 のクラスでも 引 数 として 使 える デフォルトでは 対 応 する 名 前 のプロパティにマッピ ングされる 独 自 のモデルバインダを 登 録 することで 特 殊 な 変 換 も 出 来 ちゃう (Try)UpdateModel メソッドも 用 意 されてます エンティティクラスに 対 して Update とか
ビュー これも 規 約 あります Views/(コントローラ 名 Shared)/アクション 名.aspx など Shared 下 に 置 くと 全 コントローラから 使 うことが 出 来 る ビューの 検 索 順 序 は コントローラ 名 以 下 -> Shared の 順 <% %> タグを 使 ってじゃんじゃん 埋 め 込 む HtmlHelper<TModel> という 便 利 アイテムもあるので も ちろん 使 います AjaxHelper もありますが 残 念 ながら(ry VS に 作 ってもらうのが 基 本 です Ctrl+M,V で 作 れます scaffolding にも 対 応 している ( 専 用 のテンプレート 作 れば) 楽 です
モデルとビューデータ ビューに 値 を 渡 す 方 法 は 2 種 類 あります ViewData コレクションに 値 を 突 っ 込 む View メソッドの 引 数 として 渡 す ビューから 参 照 する 方 法 ViewData からキーを 指 定 して 参 照 する Model プロパティを 直 接 参 照 する ViewData は object なのに 対 し Model は 型 を 指 定 出 来 る
こんな 時 どうします? ビューモデル Model には IEnumerable<T> を 入 れているが ページャ を 付 けるためにページ 情 報 を 追 加 したい 普 通 に 考 えると Model に IEnumerable<T> を ViewData にページ 情 報 を 入 れればいい でも ViewData って object 返 すので 使 うときにキャストしないと ダメ じゃあ IEnumerable<T> とページ 情 報 を 持 つクラスを 新 しく 作 ろう! ビューとモデル 間 でやり 取 りするのでビューモデル MVC には 含 まれてないです
ヘルパークラス ViewPage には 3 種 類 のヘルパークラスを 扱 うためのプロパティが 用 意 されています Ajax/Html/Url の 3 プロパティ 実 体 は AjaxHelper/HtmlHelper/UrlHelper よく 使 うのは HtmlHelper リンクを 作 ったり フォームを 定 義 したりするときに 使 いまくります <%= Html.ActionLink("ホーム", "index", "home") %> のように 埋 め 込 むだけ
Ajax MicrosoftAjax を 簡 単 に 使 うためのヘルパー メソッドが 用 意 されてます AjaxHelper を ViewPage.Ajax 経 由 で 使 うこと 出 来 ます Ajax.ActionLink/RouteLink/BeginForm/BeginRoute Form を 使 って 非 同 期 処 理 を 行 います Ajax と 言 っても 一 番 単 純 な XHR で HTML 断 片 を 取 得 する 機 能 だけです HTML 断 片 はパーシャルビューで 定 義 して PartialView 返 してやるだけ
パフォーマンス Html.ActionLink と Url.Action は 遅 い そりゃ コントローラ アクション パラメータ 名 まで 探 索 してたら 遅 い Html.RouteLink と Url.RouteUrl は 早 い よく 使 うヘルパーメソッドなので 注 意 しましょう やっぱりキャッシュしよう <% OutputCache %> は 使 いません OutputCache 属 性 を 使 います
結 局 誰 うま? HTML + CSS で 普 通 にデザインやってた 人 Web Form の 時 よりは HTML の 知 識 が 必 要 です デザイナとの 連 携 がしやすいんじゃないかな 俺 の 書 いた 完 璧 な HTML にイミフなコード 勝 手 に 埋 め 込 むんじゃねぇよという 人 隠 しフィールドとか 埋 め 込 まれますよね 大 量 に 大 量 のビューステートが 生 成 されるのがいやな 人 巨 大 なビューステートは 携 帯 にとっては 悪 かっこいい URI を 使 いたい 人 ( 俺 /User.aspx?id=shiba-yan -> /shiba-yan/