RealPath:
WebPath:
2018/08/12 10:29 (JST) 更新
MVC >>

Razor Pages

Contents

Razor Pages について

ASP.NET Core 2.0 から導入された、いわゆる MVVM 的な機構。(実際には View と PageModel で構成される形となる)

Razor Pages View

プロジェクト配下の Pages ディレクトリ内に .cshtml を配置し、ファイル先頭に @page ディレクティブを記述する。

従来の、ASP.NET においてのビューはコントローラを介して利用されるのが通常であったが、本機構の Razor Pages View においては @page ディレクティブの機能により、コントローラ無しでビューアクセスが可能となる。

例えば

  • /Pages/Index.cshtml には http://xxxx/Index (または http://xxxx/ ) でアクセスできる。
  • /Pages/Sample.cshtml には http://xxxx/Sample でアクセスできる。
  • /Pages/Hoge/Index.cshtml には http://xxxx/Hoge/Index (または http://xxxx/Hoge ) でアクセスできる。
  • /Pages/Hoge/Fuga.cshtml には http://xxxx/Hoge/Fuga でアクセスできる。

 
最低限の記述としては以下のような形となる。

/Pages/Sample.cshtml
@page
<p>hogehoge</p>

PageModel

Razor Pages View に紐づく形で PageModel というモデルクラスを設置することができる。

一般的には対象の .cshtml の後ろに .cs を付けたファイル名として設置するのが一般的。

例えば /Pages/Sample.cshtml に紐づく PageModel を準備する場合には /Pages/Sample.cshtml.cs という名前のファイルを設置することになる。(この場所は絶対ではないがポリシーとしてこれに従うのが分かりやすいくて良い)

  • /Pages/Sample.cshtml … Razor Pages View
  • /Pages/Sample.cshtml.cs … PageModel

 
Razor Pages View 側では通常の Razor View と同じような形で @model ディレクティブにより関連するモデルクラスを指定する。

/Pages/Sample.cshtml
@page
@model SampleModel
<h3>@Model.RandomMessage</h3>

<p>Hello</p>

 
PageModel は PageModel クラスを継承する形で定義を行う。

/Pages/Sample.cshtml.cs
using Microsoft.AspNetCore.Mvc.RazorPages;
using System;

public class SampleModel : PageModel
{
    public string RandomMessage { get; set; }

    public void OnGet()
    {
        RandomMessage = new Random().Next() + "";
    }
}

PageModel は通常のモデルと同様にプロパティを持つことができ、これを介して View 側に必要な情報を伝える。通常のモデルとの違いとして OnGet() メソッドにより GET アクションを補足できる点がある。

ビュー側にロジックを書くことは通常好ましくないとされているが、本機構により PageModel の OnGet() 側に(それほど複雑でない)ロジックを記述することにより、ビューからロジックを分離することができる。

 
※従来の MVC アーキテクチャにおいてもビューからロジックは分離されていたが、本機構の Razor Pages においてもコントローラを介さずにビューからロジックを分離する仕組みがある、ということです。

Razor Pages の有効化

ASP.NET Core 2.0 プロジェクトを新規で作っていればデフォルトで記述されている内容なので特段意識する必要はないが、Razor Pages の有効化は Startup.cs の以下の箇所で行われている。

/Startup.cs
public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        // Includes support for Razor Pages and controllers.
        services.AddMvc();
    }

    public void Configure(IApplicationBuilder app)
    {
        app.UseMvc();
    }
}

参考