Skip to content

MS_ASPNETCoreMVC

nishi_74322014 edited this page Aug 21, 2026 · 2 revisions

ASP.NET Core MVC

概要

MVC5(ASP.NET MVC)との差異について。

補足(統合されたもの): ASP.NET Core MVC は、
.NET Framework 時代に別々のフレームワークだったものを 1 本に統合している。

System.Web.Mvc(ASP.NET MVC 5) Microsoft.AspNetCore.Mvc
System.Web.Http(ASP.NET Web API 2) 同上(ControllerBase
ASP.NET Web Pages Razor Pages

旧環境では「MVC の Controller」と「Web API の Controller」が
別の基底クラス・別のパイプライン・別のフィルタを持っていた。
これが統合され、**Controller(View あり)と ControllerBase(API のみ)**の
継承関係の違いだけになった。

詳細

基盤部分の差異

ASP.NET Coreへの移行を参照)

  • フォルダ構成
  • パッケージ・マネージャ
  • 設定・構成
    • 初期化
    • DI のサポート
  • ライブラリ
    • System.Web
    • Microsoft.Owin
    • NuGet ライブラリ
    • 未分類の API

MVC5 との差異

  • M:Model
  • V:View
  • C:Controller

Model

非互換は少ない模様。

View

Razor

  • 非互換は少ない模様。
  • また、Razor Pagesをプロジェクト内で併用可能。

Tagヘルパー

従来の Html ヘルパーは、

@Html.Label("FirstName", "First Name:", new { @class = "caption" })

などと記述していたが、Tag ヘルパーでは、

<label class="caption" asp-for="FirstName"></label>

と標準の HTML のように記述できる。

補足(Tag ヘルパーの利点): 単に見た目が HTML に近いだけでなく、

  • デザイナが触れる(HTML エディタの補完・整形が効く)
  • IntelliSense が効くasp-for はモデルのプロパティを補完)
  • Html ヘルパーと違い、閉じタグまで自分で書ける(出力の制御が容易)

という実務上の差がある。
Html ヘルパーも引き続き使えるため、混在させても動作する。

EnvironmentTagHelper

環境(Development / Production)でレンダリングを切り替える。

ScriptTagHelper

全体的に、Globbing patterns による指定が可能。

属性 内容
asp-append-version src にファイルのバージョンを追加するかどうか(キャッシュ対策)
asp-src-include 複数のファイルを読み込む
asp-src-exclude asp-src-include から除外する(併用する)
asp-fallback-src src の読み込みに失敗した場合に読み込む fallback ファイル
asp-fallback-test 読み込みに失敗したかどうかの判定を行うスクリプト(asp-fallback-src と併用)
asp-fallback-src-include 失敗時の fallback ファイル一式(asp-fallback-src と併用)
asp-fallback-src-exclude 除外する fallback ファイル(asp-fallback-src-include と併用)

補足: asp-append-version="true"
ファイル内容のハッシュをクエリ文字列に付ける
site.css?v=xxxx)。キャッシュ バスティングの定番で、
「CSS を直したのに反映されない」を防ぐ。

asp-fallback-* は CDN 障害時のフォールバック用だが、
現在は **Subresource Integrity(integrity 属性)**と
併せて使うのが望ましい
セキュリティ関連のHTTPヘッダを参照)。

HTML系のTagHelper

  • LabelTagHelper / LinkTagHelper / AnchorTagHelper / ImageTagHelper
  • FormTagHelper
    • InputTagHelperinput
    • TextAreaTagHelpertextarea
    • SelectTagHelperselect)> OptionTagHelperoption
    • FormActionTagHelperform
    • RenderAtEndOfFormTagHelper

補足: FormTagHelper
アンチフォージェリ トークンを自動で埋め込む
MVC 5 で必要だった @Html.AntiForgeryToken() の明示的な記述が不要になり、
CSRF 対策の漏れが起きにくくなっている(ASP.NET MVCを参照)。

その他

  • Cache — CacheTagHelper / CacheTagHelperBase / DistributedCacheTagHelper
  • Validation — ValidationMessageTagHelper / ValidationSummaryTagHelper
  • Extensions — TagHelperOutputExtensions

参考

その他

WebViewPage が無い

  • RTM では実装されていなかったようだが(?)、最近はあるらしい。
  • 継承する元が Microsoft.AspNetCore.Mvc.Razor 名前空間の RazorPage に変わっている。

Display Mode が無い

レスポンシブ以外で PC とスマートフォンに対応できない。
# 独自にヘッダを参照して、View を振り分けるなどの対応が必要になる。

補足: 現在も Display Mode は復活していない。
代替としては、

  • レスポンシブ デザイン(既定の答え)
  • IViewLocationExpander を実装して、View の探索パスを自分で差し替える

の 2 つになる。後者を使えば
Views/Home/Index.Mobile.cshtml のような運用は再現できる。

Ajax.BeginForm が無い

  • Ajax.BeginForm がサポートされない。
    また、Controller.JavaScript メソッド、JavaScriptResult クラスが無くなっている。

  • 必要に応じて、独自の JavaScriptResult を実装することが推奨されている。

  • 参考

補足(現在の代替): Ajax.BeginForm
jQuery unobtrusive-ajax に依存した仕組みだった。
現在の対応物は次の通り。

やりたいこと 現在の手段
画面の一部だけ更新 fetch + 部分 View(PartialView)を返す
宣言的に書きたい htmxhx-post 等)が近い思想
C# で完結させたい Blazor

Controller

共通

Filters

.NET Standardへの移行を参照。

Routing

Routing の構成方法が異なっている。

補足(最新化): ASP.NET Core 3.0 以降は
エンドポイント ルーティングに刷新された
app.UseRouting()app.UseEndpoints()、現在は app.MapControllers())。

ルーティング情報がミドルウェア パイプラインの早い段階で確定するため、
認可ミドルウェアが「どのエンドポイントに向かうか」を知った上で
判断できる、という利点がある。

MVC

以下から、いくらか、影響を受ける。

  • 要求処理パイプラインの変更
  • 認証周りの API の変更

WebAPI

CORS

CORS の構成方法が異なっている。

補足(AllowAnyOrigin の罠): サンプルでよく見る
「すべてのオリジンを許可」は、AllowCredentials() と併用できない
(ブラウザが拒否する)。
Cookie 認証の SPA では必ずオリジンを列挙することになる。

policy.WithOrigins("https://app.example.com")
      .AllowCredentials()
      .AllowAnyHeader().AllowAnyMethod();

また、UseCors()UseRouting() の後、UseAuthorization() の前
置く必要がある。順序を誤ると効かない。
詳細は CORS / クロス ドメイン接続を参照。

Shim

Shim を利用して互換性を上げ移行性を上げることができる。

補足: WebApiCompatShimASP.NET Core 3.0 で削除された。
移行の一時しのぎとしては有効だったが、現在は使えない。
HttpResponseMessage を返すコードは IActionResult に書き換える。

SPA

JavaScriptServices

(非推奨。ASP.NET SPAを参照)

その他

MVCのDI

MVC の各要素への依存関係の挿入方法が用意されている。

ViewComponent

  • 部分 View と似ている。応答全体ではなく、チャンクをレンダリングする。

  • しかし、以下の点で部分 View より強力と言える。

    • Controller と View の間の関心の分離とテストの容易性の利点。
    • パラメタとビジネス ロジックを含めることができる。

用途

部分 View には複雑な、サイドバーのコンテンツなどの、
再利用可能なレンダリング ロジックを部品化する。

  • ログイン パネル
  • ショッピング カート
  • 動的なナビゲーション メニュー
  • 新着情報の記事
  • タグ クラウド(タグ付きのコンテンツのアクセス頻度を一括集計してテキスト表示する)

利用方法

  • 通常、Controller ではなく、View(Layout)から呼び出される。
  • ViewComponent の呼び出し方法には、以下の 2 つの方法がある。
    • @Component.InvokeAsync メソッドで呼び出す。
    • Tag ヘルパーで呼び出す。
  • Model バインディングは使用せず、指定されたデータのみに依存する。

構成

ViewComponent は、以下の 2 つのパーツで構成される。

  • Model のようなクラス(通常、ViewComponent から派生)
  • 返される結果(通常は View)

参考

参考

MSDN magazine

  • 実際の ASP.NET Core MVC フィルター
  • ASP.NET Core MVC 向け機能スライス
  • Razor ページを使った簡単な ASP.NET MVC アプリ
  • ASP.NET MVC Core ビューのガイドライン

内部リンク


Tags: 移行, .NET開発, .NET Core, ASP.NET, ASP.NET MVC

NetDevInfraWiki

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

(未着手)

開発基盤部会 Wiki

移行管理: DONETODO

Clone this wiki locally