-
Notifications
You must be signed in to change notification settings - Fork 0
MS_ASPNETCoreMVC
- 戻る(ASP.NET MVC、ASP.NET Web API、ASP.NET Core)
- ASP.NET Core MVC
- ASP.NET Web Pages
- ASP.NET Coreへの移行
MVC5(ASP.NET MVC)との差異について。
補足(統合されたもの): ASP.NET Core MVC は、
.NET Framework 時代に別々のフレームワークだったものを 1 本に統合している。
旧 新 System.Web.Mvc(ASP.NET MVC 5)Microsoft.AspNetCore.MvcSystem.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.WebMicrosoft.Owin- NuGet ライブラリ
- 未分類の API
- M:Model
- V:View
- C:Controller
非互換は少ない模様。
- 非互換は少ない模様。
- また、Razor Pagesをプロジェクト内で併用可能。
従来の 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 ヘルパーも引き続き使えるため、混在させても動作する。
環境(Development / Production)でレンダリングを切り替える。
全体的に、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ヘッダを参照)。
-
LabelTagHelper/LinkTagHelper/AnchorTagHelper/ImageTagHelper -
FormTagHelper-
InputTagHelper(input) -
TextAreaTagHelper(textarea) -
SelectTagHelper(select)>OptionTagHelper(option) -
FormActionTagHelper(form) RenderAtEndOfFormTagHelper
-
補足:
FormTagHelperは
アンチフォージェリ トークンを自動で埋め込む。
MVC 5 で必要だった@Html.AntiForgeryToken()の明示的な記述が不要になり、
CSRF 対策の漏れが起きにくくなっている(ASP.NET MVCを参照)。
- Cache —
CacheTagHelper/CacheTagHelperBase/DistributedCacheTagHelper - Validation —
ValidationMessageTagHelper/ValidationSummaryTagHelper - Extensions —
TagHelperOutputExtensions
-
Microsoft Learn
- ASP.NET Core のタグ ヘルパー
https://learn.microsoft.com/aspnet/core/mvc/views/tag-helpers/intro - ASP.NET Core の組み込みタグ ヘルパー
https://learn.microsoft.com/aspnet/core/mvc/views/tag-helpers/built-in/ - ASP.NET Core でタグ ヘルパーを作成する
https://learn.microsoft.com/aspnet/core/mvc/views/tag-helpers/authoring
- ASP.NET Core のタグ ヘルパー
-
ASP.NET CoreのScriptTagHelperについて調べてみる - Qiita
https://qiita.com/takasan/items/13fdd17a9254b74046d3 -
ASP.NET Core MVC の Razor で使える Tag Helpers のメモ書き - しばやん雑記
http://blog.shibayan.jp/entry/20170725/1500966960
- RTM では実装されていなかったようだが(?)、最近はあるらしい。
- 継承する元が
Microsoft.AspNetCore.Mvc.Razor名前空間のRazorPageに変わっている。
レスポンシブ以外で PC とスマートフォンに対応できない。
# 独自にヘッダを参照して、View を振り分けるなどの対応が必要になる。
-
Will ASP.NET Core still support DisplayMode? · Issue #5116 · aspnet/Mvc
https://github.com/aspnet/Mvc/issues/5116There aren't any plans to bring back Display Modes.
補足: 現在も Display Mode は復活していない。
代替としては、
- レスポンシブ デザイン(既定の答え)
IViewLocationExpanderを実装して、View の探索パスを自分で差し替えるの 2 つになる。後者を使えば
Views/Home/Index.Mobile.cshtmlのような運用は再現できる。
-
Ajax.BeginFormがサポートされない。
また、Controller.JavaScriptメソッド、JavaScriptResultクラスが無くなっている。 -
必要に応じて、独自の
JavaScriptResultを実装することが推奨されている。 -
参考
- AjaxHelper · Issue #2015 · aspnet/Mvc
https://github.com/aspnet/Mvc/issues/2015 - System.Web.Mvc.JavaScriptResult.JavaScriptResult() · Issue #2953 · aspnet/Mvc
https://github.com/aspnet/Mvc/issues/2953
- AjaxHelper · Issue #2015 · aspnet/Mvc
補足(現在の代替):
Ajax.BeginFormは
jQuery unobtrusive-ajax に依存した仕組みだった。
現在の対応物は次の通り。
やりたいこと 現在の手段 画面の一部だけ更新 fetch+ 部分 View(PartialView)を返す宣言的に書きたい htmx( hx-post等)が近い思想C# で完結させたい Blazor
Routing の構成方法が異なっている。
-
以下のようなパラメタが使用可能。
[controller][action]
-
Routeに統一(RoutePrefixが無くなった) -
参考
- Class 属性: https://github.com/OpenTouryoProject/OpenTouryo/blob/develop/root/programs/CS/Samples4NetCore/Backend/ASPNETWebService/ASPNETWebService/Controllers/JsonController.cs#L70
- Method 属性: https://github.com/OpenTouryoProject/OpenTouryo/blob/develop/root/programs/CS/Samples4NetCore/Backend/ASPNETWebService/ASPNETWebService/Controllers/JsonController.cs#L117
補足(最新化): ASP.NET Core 3.0 以降は
エンドポイント ルーティングに刷新された
(app.UseRouting()→app.UseEndpoints()、現在はapp.MapControllers())。ルーティング情報がミドルウェア パイプラインの早い段階で確定するため、
認可ミドルウェアが「どのエンドポイントに向かうか」を知った上で
判断できる、という利点がある。
以下から、いくらか、影響を受ける。
- 要求処理パイプラインの変更
- 認証周りの API の変更
CORS の構成方法が異なっている。
-
Microsoft.AspNetCore.Cors -
以下の指定で、CORS (Cross-Origin Resource Sharing)を有効化する。
// UseCorsでAllowAllOriginsを指定。 app.UseCors("AllowAllOrigins");
-
参考
- ASP.NET Core で CORS を有効にする | Microsoft Learn
https://learn.microsoft.com/aspnet/core/security/cors
- ASP.NET Core で CORS を有効にする | Microsoft Learn
補足(
AllowAnyOriginの罠): サンプルでよく見る
「すべてのオリジンを許可」は、AllowCredentials()と併用できない
(ブラウザが拒否する)。
Cookie 認証の SPA では必ずオリジンを列挙することになる。policy.WithOrigins("https://app.example.com") .AllowCredentials() .AllowAnyHeader().AllowAnyMethod();また、
UseCors()はUseRouting()の後、UseAuthorization()の前に
置く必要がある。順序を誤ると効かない。
詳細は CORS / クロス ドメイン接続を参照。
Shim を利用して互換性を上げ移行性を上げることができる。
-
Microsoft.AspNetCore.Mvc.WebApiCompatShim -
参考
- WebApiCompatShim でのアプリケーション モデルの使用法 | Microsoft Learn
https://learn.microsoft.com/aspnet/core/mvc/controllers/application-model - ASP.NET Core MVC で HttpResponseMessage をそのまま HTTP レスポンスとして使う - Qiita
https://qiita.com/TakahikoKawasaki/items/8bc8433332d01728c6e9
- WebApiCompatShim でのアプリケーション モデルの使用法 | Microsoft Learn
補足:
WebApiCompatShimは ASP.NET Core 3.0 で削除された。
移行の一時しのぎとしては有効だったが、現在は使えない。
HttpResponseMessageを返すコードはIActionResultに書き換える。
- 参考
- JavaScriptServices を使用して ASP.NET Core の単一ページ アプリケーションを作成するには
https://learn.microsoft.com/aspnet/core/client-side/spa-services
- JavaScriptServices を使用して ASP.NET Core の単一ページ アプリケーションを作成するには
(非推奨。ASP.NET SPAを参照)
MVC の各要素への依存関係の挿入方法が用意されている。
- 参考
-
部分 View と似ている。応答全体ではなく、チャンクをレンダリングする。
-
しかし、以下の点で部分 View より強力と言える。
- Controller と View の間の関心の分離とテストの容易性の利点。
- パラメタとビジネス ロジックを含めることができる。
部分 View には複雑な、サイドバーのコンテンツなどの、
再利用可能なレンダリング ロジックを部品化する。
- ログイン パネル
- ショッピング カート
- 動的なナビゲーション メニュー
- 新着情報の記事
- タグ クラウド(タグ付きのコンテンツのアクセス頻度を一括集計してテキスト表示する)
- 通常、Controller ではなく、View(Layout)から呼び出される。
- ViewComponent の呼び出し方法には、以下の 2 つの方法がある。
-
@Component.InvokeAsyncメソッドで呼び出す。 - Tag ヘルパーで呼び出す。
-
- Model バインディングは使用せず、指定されたデータのみに依存する。
ViewComponent は、以下の 2 つのパーツで構成される。
- Model のようなクラス(通常、
ViewComponentから派生) - 返される結果(通常は View)
- ビュー コンポーネント | Microsoft Learn
https://learn.microsoft.com/aspnet/core/mvc/views/view-components
- ASP.NET MVC 6 の概要だけをサクッとまとめておきたい - しばやん雑記
http://blog.shibayan.jp/entry/20141123/1416746894
- 実際の 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
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。