Open棟梁Project - マイクロソフト系技術情報 Wiki

目次

概要

MVC

ASP.NET MVCの用語」は
ASP.NET MVCの利用方法」と比べて、
ASP.NET MVCの基本的なトピックをまとめています。

M(Model)に実装される処理

Modelには、

がある。

V(View)に実装される処理

View = 画面表示のための処理。

C(Controller)に実装される処理

モジュールの作成順

  1. C(Controller)を作成
  2. V(View)を作成
  3. M(Model)を作成
  4. C(Controller)にAction Methodを追加し、C→M→Vと繋げる。

C(Controller)関連

URL ルーティング

ルート定義

既定のルート定義

属性ルーティングによるルート定義

ルートプレフィックスの定義

ルートプレフィックスを使用すると、モデルレベルに、
「URL with parameters」のルート部分の定義を追加できる。

呼び出されるAction Methodとその引数

この時、ブラウザから

http://server/applicationname/Products/Index/1

というURLでリクエストを送信した場合、

http://(Server FQDN名)/(Controller名)/(Action Method名)/(id 値)

ルート定義に従い、ページハンドラは

と判断し、

Products Controllerの Index Action Methodを呼び出し、Action Methodの引数として "1" を渡す。
Action Method名と id 値は省略可能で、Action Method名を省略すると、Index Action Methodが実行される。

Action Method

リクエストデータの取得方法

戻り値

Action Methodの結果として、Action Resultを返す。
詳細はAction Resultを参照。

単方向バインディング

ValuProvider?

Requestを検索してValueを取得するクラス。

ModelBinder?

ModelBinder?属性

前述のModelBinder?の動作を制御する。

通常、

から取得するようになっているが、

以下の属性をAction Methodの引数に対して使用すると、この動作を変更できる。

Bind属性

ASP.NET MVCは、ASP.NET Web Formsと比べて、
オーバーポスティング攻撃を受け易いため引数を明記する仕組み。

参考

双方向バインディング

Modelプロパティ

@modelで定義したModelプロパティと、

Html.xxxxFor

のHTMLヘルパーを使用する。

双方向バインディングの方法

以下のように双方向バインドする。

通常、Modelプロパティは、Modelでアクセスするが、 ここでのmodelはラムダ式の仮引数名なので自由。

XxxxxとXxxxxFor?の違い

Action Result

Controller のAction Methodは、View の選択と指示として、
ActionResult クラスのオブジェクトを返す必要がある。

Action Methodで、

return View();

と、Viewを指定しないoverloadで呼び出すと、

/Views/コントローラ名/アクション名.cshtml

を呼び出す。

ActionResult?の種類とヘルパー・メソッド

ActionResult? クラスには、以下の種類が存在する。

項番種類概要・用途コード例(ヘルパー・メソッド)
ViewResult?指定された全体 View の表示を指示する。
基本的には HTML.BeginForm の場合に使用する。
return View("Result");
("Result" は全体 View 名)
PartialViewResult?指定された部分 View の表示を指示する。
基本的には Ajax.BeginForm の場合に使用する。
return PartialView?("Result");
("Result" は部分 View 名)
RedirectResult?指定した URL にリダイレクトする場合に使用する。return Redirect("http://www.wings.msn.to/");
RedirectToActionResult?指定した Controller, Action にリダイレクトする場合に使用する。return RedirectToAction?("Index");
指定したルートパラメタ(routeName, routeValues)にリダイレクトする場合に使用する。return RedirectToRoute?("View Product", new { ProductName? = <商品名> });
FilePathResult?指定されたパスの内容をファイルとして出力return File("C:\temp\file.zip", "application/zip", "file.zip");
FileContentResult?byte配列の内容をファイルとして出力return File(bytes, "application/pdf");
FileStreamResult?ストリームの内容をファイルとして出力return new FileStreamResult?(fileStream, "application/pdf");
ContentResult?プレーン・テキストを出力(CSV出力等)Return Content("こんにちは、世界!", "text/plain");
10JsonResult?指定されたコンテンツをJSONとして出力(Ajax通信)return Json(JsonConvert?.SerializeObject?(result), JsonRequestBehavior?.AllowGet?);
11JavaScriptResult?指定されたコンテンツをJavaScriptスクリプトとして出力return JavaScript(code);
12EmptyResult?何もしない

HttpStatusCodeResult?

Viewではなく、HTTP状態コードを返す。

項番種類概要・用途コード例(ヘルパー・メソッド)
HttpStatusCodeResult?任意のHTTP応答コードをセット
HttpUnauthorizedResult?HTTP応答コード「401 Unauthorized」をセット
HttpNotFoundResult?HTTP応答コード「404 NotFound?」をセット

ActionResult?の自作

可能

属性

フィルタ属性

セレクタ属性

ControllerからのActionMethod?の呼び出しを制御する。

項番属性概要
HttpXxxxx属性Action Methodが受け付けるHTTP Methodを指定
AcceptVerbs属性Action Methodが受け付ける1つ以上のHTTP Methodを指定
NonAction?属性Action Methodでないことを明示する。
ActionName属性Action Method名と別名のAction Nameを付与する。

セレクタ属性は、自作可能。

非同期Controller

旧(AsyncController?を継承する。)

Task<ActionResult?>を返す。

MVC 4 以降であれば、以下のように書ける。

参考

M(Model)関連

ここでは、B層クラスではなく、

「B層クラスが返すViewに渡される
Entity, Bean, POCO的なクラス(ViewModel?)」

について説明する。

ViewBag?, ViewData?, TempData?

ControllerからViewにデータを渡すときに使用する入れ物的なモノ。

ViewBag?

ViewData?

TempData?

Modelプロパティ

Viewスクリプトから強く型付けされたViewModel?を参照する際に使用する。

使い方

参考

V(View)関連

View には、

ビューエンジン

Webページのビューエンジンには以下の2つのものがある。

ASPX

従来の ASP.NET と同様、
式やコードブロックを コード・ナゲット(<% ~ %>)で囲む記述形式。
View の拡張子も、従来の ASP.NET と同様、「*.aspx」で表される。

Razor(主流)

ASP.NET MVC 3 で登場したビューエンジン。
式やコードブロックの先頭に「@」を付与する記述形式で、
冗長なコード・ナゲット(<% ~ %>)が不要になる。
View の拡張子は、C# の場合は「*.cshtml」、VB の場合は「*.vbhtml」で表される。

参考

全体 View

通常のViewはコレ。

部分 View

部分 View は、「Partial View」ともいわれ、以下の用途で使われる。

配置場所

使用方法(部分Viewだけ呼び出す)

使用方法(Action Methodと部分Viewの両方を呼び出す)

Viewヘルパー

従来の ASP.NET では、ASP.NET Web コントロールを使用して、
ラベルやテキストボックスなどのコントロールを表示していたが、

ASP.NET MVC では、基本的に、以下の様な便利な機能が実装されているViewヘルパーを使用する。

主な Viewヘルパー

ASP.NET MVC では、主に以下のような Viewヘルパーが使用できる。

2種類のHTMLヘルパー

Html.xxxx と Html.xxxxFor の2種類のHTMLヘルパーがある。

ただし、HTTP を経由しての双方向バインディングになるので、
処理方式的には、以下のような処理シーケンスになる。

マスターページ

ヘッダーやフッター、サイドメニューなどをアプリケーションで共通的に表示させたい場合、
マスターページを使用してレイアウトを共通化させることができる。
マスターページには、画面ごとに個別実装が必要な箇所を定義する。

ビューエンジン

配置場所と使用方法

マスターページへのセクションの定義

メインのコンテンツ領域以外に、画面ごとに個別実装が必要な箇所を定義する場合、
RenderSection? を使用して「セクション」と呼ばれるサブのコンテンツ領域を定義する。

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width" />
    <title>@ViewBag.Title</title>
    @Styles.Render("~/Content/css")
    @Scripts.Render("~/bundles/modernizr")
</head>
<body>
    <!-- メインのコンテンツ領域を描画する場所を定義 -->
    @RenderBody()

    @Scripts.Render("~/bundles/jquery")
    <!-- セクション (サブのコンテンツ領域) を描画する場所を定義 -->
    @RenderSection("scripts", required: false)
</body>
</html>

マスターページの利用

で囲む必要がある。

マスターページのネスト

マスターページの選択

@{
    Layout = "~/Views/Shared/_XXXXLayout.cshtml";
}

BeginForm?

BeginForm?には以下の2つのものがある。

Html.BeginForm?の特徴

従来のASPなどでMVC方式を採用した場合と同じ、画面全体を再描画する仕組み。

Ajax.BeginForm?の特徴

クライアント・サイドのJavaScriptフレームワークとシームレスに連動して部分更新を実現する仕組み。

@系

@inherits

@modelに置き換えられた。

@model

Viewスクリプトから強く型付けされたViewModelを参照する際に使用する。

@section

マスタページを利用する際、定義されたsectionを実装する。

@helper

Viewスクリプト内にViewヘルパーを定義。

Razor系

フォルダ構成

既定のフォルダ構成

ASP.NET MVC のテンプレートは、グルーピングを目的に、既定で以下のフォルダ構成となっている。
それぞれのフォルダには、以下のようにファイルを配置することが推奨されている。

項番フォルダ名配置されるファイル備考
App_Start起動時に、初期設定を行うモジュール-
ContentsCSSBundleConfig? が使用しているため、既定の CSS ファイルは変更しない
ControllersController-
ModelsModel-
ScriptsJavaScriptBundleConfig? が使用しているため、既定の JavaScript ファイルは変更しない
ViewsView対応する Controller 名のフォルダ以下に、View のファイルを配置する

Views\(コントローラー名)\Index.cshtml

Area (区分)による分割

Area (区分) とは、ASP.NET MVC アプリケーションを論理的に分割する仕組みのことである。
(ASP.NET MVC プロジェクトをシステム全体とすると、Area ごとにサブシステム (のようなもの) に分割できる。
App_Start のマップルートが追加されるような感じ、と理解すると分かりやすいかもしれない)


Tags: :ASP.NET, :ASP.NET MVC


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS