いまさらながらASP.NET Core Razor Pages(以下Razor Pages)で小さなサイトを作ってみました。MSはRazor Pagesを推奨しているようですが、実際に使ってみてMVCから乗り換えるに値するものなのか判断できればいいなーと思っています。まだまだ分かっていない部分があるので間違っていたらご指摘頂ければと思います。

使用環境

今回作成したRazor Pagesのプロジェクトと比較対象のMVCプロジェクトは以下のようなかんじです。.NET Coreバージョンの違いによる問題をPagesの問題と勘違いしている可能性があります。開発環境はVisual Studio 2019 16.4.2です。

プロジェクト .NET Core Version ページ数
Razor Pages 3.1 ~20
MVC 2.1 100+

メリット

ViewModelクラスを定義しなくていい

MVCではページごとにViewModelクラスをいちいち作るのが面倒くさいです。ViewDataやViewBagもいまいちです。Pagesではcshtml.csに定義されるページ専用コントローラー兼ビューモデルであるPageModelクラスが自動で作成されます。これをそのままViewModelにすることができます。ビューに渡したいデータがあればPageModelクラスに新しいプロパティを追加してそれに値をセットすればビューから参照できます。もちろん型情報付きです。

つまりRazor Pagesはコントローラーをビューモデルと共用しているわけです。これは単一のビューに限定されたクラスだからできることだと思いますし、実際便利だと思いました。MVCではコントローラークラスは複数ページ共用なのでこれをやれないんですね。

ルーティングが分かりやすい

Razor Pagesではページ毎に1ファイルというかんじになるので、フォルダ構造がそのままルーティング構造になります。Razor PagesではこのURLならこのファイルだなとすぐ分かります。

デメリット

ページを持たないアクションは結局MVCで作る

例えばAjaxアクションなどはページビューがないためRazor Pagesでは表現できないため、MVCで作ることになります。なのですべてのアクションをRazor Pagesに移行できるわけではないです。

独自のルーティングルールがある

Razor Pagesには独自のルーティングルールがあります。リンクもUrl.ActionではなくUrl.Pageで作ります。すべてのアクションをRazor Pagesにするのであれば問題ありませんが、MVCと混在することを前提とした場合、ルーティングルールが2つあるというのはちょっと負担になります。

複数ページでコードを共用しにくい

Razor Pagesでは1ページ毎に専用コントローラーになるので、MVCのように複数アクションでメソッドを共用したり、部分ビューを共用することがやりにくいです。

例えばCRUDのCreateとUpdateでフォームの部分ビューを作って共用したい場合、MVCでは各コントローラーのViewsフォルダ内に置けばよいですが、Razor PagesではSharedフォルダに置くことになります。Sharedフォルダが混雑しそうです。

またメソッド場合は、PageModelの継承クラスを定義したりすることになるのでしょうか。

Visual Studioが不安定

デバッグ実行とデバッグなし実行を切り替えたり、ビルドを実行したりなどのタイミングで、ブラウザ更新をかけるとページが表示されない状態になります。MVCではそんなことありませんでした。

Visual Studioが不安定2

使用していると、変数名やクラス名を変更したりなどするタイミングでVSが応答なしになることがあります。復帰までに1分くらいかかります。1度この状態になると頻繁にこの現象が発生するのでVSを再起動しています。すると数時間は持ちます。アナライザが何やらしているような感じです。MVCではそんなことありませんでした。

*.cshtmlの変更だけでコンパイルが走る

MVCでは*.cshtmlだけの変更であれば1秒未満で反映できていましたが、Razor Pagesでは*.cshtmlだけの変更でも2秒ほどかかります。PageModelもコンパイルしているのでしょうか。

ただ、*.cshtml.csやその他の*.csの変更によるコンパイル時間はMVCより早いように感じます。MVCはプロジェクト全体をコンパイルしている感じで、Razor Pagesは関連するページだけコンパイルしている感じです。間違っていたらすみません。

所感まとめ

  • Razor PagesはMVCに置き換わるものではなく、共存可能な独自の仕組み
  • すべてのアクションをMVCからRazor Pagesに乗り換えることは出来ない
  • ビューへの値渡しを気軽にできるのはよかった
  • 現状、VSが不安定すぎて使えない。(Razor Pagesに依存する問題かどうかは分からないが)
  • *.cshtmlの変更だけでコンパイルするのはやめてほしい。