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 ルーティング

ルート定義

routes.MapRoute(
    "Default",                     // Route name
    "{controller}/{action}/{id}",  // URL with parameters
    new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
);

呼び出される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が実行される。

単方向バインディング

クライアントから送信されてきたデータのキー名と、
ControllerのAction Methodの引数名とが一致するキー値を探して、バインドする。

仕組みの詳細は、下記を参照。

ModelBinder?

ModelBinder?ValuProvider?から必要なデータを取得し、Modelに対して値の設定を行う。
DefaultModelBinder?は、以下の「既定のValuProvider?」から必要なデータを検索する。

ValuProvider?

Bind属性

Entity Frameworkで、DBファーストでEDMファイル(*.edmx)を作成し、
モデル(Entity)を生成した後に、DataAnnotation?ModelMetadata?を設定するのは、
困難 & 不可能なので、Bind 属性で設定する仕組みとして設けられたものと思われる。

参考

双方向バインディング

Modelプロパティ

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

Html.xxxxFor

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

使い方

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

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

Action Method

リクエストデータと引数の関連付け

マップの方法

戻り値

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

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");
指定したルート名にリダイレクトする場合に使用する。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?プレーン・テキストを出力(Ajax通信)Return Content("こんにちは、世界!", "text/plain");
JsonResult?指定されたコンテンツをJSONとして出力(Ajax通信)return Json(JsonConvert?.SerializeObject?(result), JsonRequestBehavior?.AllowGet?);
JavaScriptResult?指定されたコンテンツをJavaScriptスクリプトとして出力return JavaScript(code);
HttpUnauthorizedResult?承認の失敗時にHTTP応答コード「401 Unauthorized」をセット
EmptyResult?何もしない

HttpStatusCodeResult?

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

非同期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 コントロールを使用して、
ラベルやテキストボックスなどのコントロールを表示していたが、

主な 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系


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


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