SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

進化した「ASP.NET Core 2.0」新しいWeb開発手法を学ぶ

ASP.NET Core 2.0でRazor Pagesアプリケーションを作ろう

進化した「ASP.NET Core 2.0」新しいWeb開発手法を学ぶ 第2回

Razor Pagesアプリケーションを作成しよう(2)

Razor Pagesページの作成

 ASP.NET Coreでは実装するページは「cshtml」という拡張子のHTMLファイルとして作成します。これはRazor Pagesのアプリケーションでも同じです。Razor Pagesではさらに、ファイルの先頭に「pageディレクティブ」というRazor Pagesで実装したページであることを宣言する記述を追加する必要があります。

 リスト3はアプリケーションのトップページとなるRazor Pagesページで、タイトルと現在時刻を表示するだけの非常に簡単なページです。プロジェクトのルートディレクトリに「Pages」という名前のディレクトリを作成し、その中に「Index.cshtml」ファイルを作成して編集します。

リスト3 ページ単位でRazor Pagesを有効にする設定(Index.cshtml)
@page ・・・【1】
@model IndexModel ・・・【2】
@namespace Sample.RazorPages.Pages
@using Microsoft.AspNetCore.Mvc.RazorPages

@functions { ・・・【3】
    public class IndexModel : PageModel ・・・【4】
    {   
        public string Message { get; set; } ・・・【4】-1

        public void OnGet() ・・・【4】-2
        {   
            var now = DateTime.Now.ToString();

            Message += $"現在時刻: {now}";
        }   
    }   
}

<h2>Razor Pages Sample トップページ</h2> ・・・【5】
<p>
    @Model.Message ・・・【6】
</p>

 構成要素についてそれぞれ説明します。

【1】pageディレクティブ

 Razor Pagesのページには必ずpageディレクティブによる宣言が必要です。また、pageディレクティブはファイル内の最初のディレクティブである必要があります。

【2】ページモデルの宣言

 このページで利用するページモデルの宣言をします。ここで宣言したページモデルは「@Model」としてページ内で参照することができるようになります。

【3】functionsディレクティブ

 functionsディレクティブはクラスやメソッドを記述することができる領域です。通常のHTMLファイルにおけるscriptタグとその中のJavaScriptコードと同じ位置づけであると思ってください。ここではページモデルクラスを丸々functionsディレクティブ内で定義しています。

【4】ページモデルクラス

 PageModelを継承したクラスで、クラス名は【2】に使用されます。ページモデルクラスにはページが使用することのできるプロパティ(【4】-1)やHTTPのリクエストに対応するハンドラーメソッド(【4】-2)などを実装します。HTTPに対応するハンドラーメソッドを実装するには、「On + <HTTPメソッド名>」の命名規則に沿ってメソッドを定義する必要があります。なお、メソッド内で非同期処理が必要な場合は、asyncキーワードを付与した非同期メソッドとしてメソッドを定義することも可能です。その際は慣例としてメソッド名の最後に「Async」を付けます。

【5】ビュー

 画面に表示されるHTMLコードです。ページモデルの他、ASP.NET Core MVCと同様にタグヘルパーやHTMLヘルパーを使用することができます。

【6】ページモデルの使用

 【4】で実装し、【2】で宣言したページモデルのインスタンスを「@Model」で参照しています。ここではMessageプロパティにアクセスしてプロパティが保持している値を表示しようとしています。

 このIndex.cshtmlを保存して再度「dotnet run」を実行、ブラウザからアクセスしてみましょう。図4の通り、タイトルと現在時刻が表示されれば成功です。

図4 Index.cshtml作成後のアプリケーションのトップページ
図4 Index.cshtml作成後のアプリケーションのトップページ

Razor PagesでのURLルール

 Pagesアプリケーションでは、Pagesディレクトリ配下のディレクトリ名とcshtmlファイル名によってURLが決定します。ページファイルの配置位置とURLが一致するため、URLの管理が非常に簡単になります。

 例外として、各ディレクトリにあるIndex.cshtmlは「Index」を省略してアクセスすることができます。またPagesディレクトリ配下にあるIndex.cshtmlがアプリケーションのルートページとなります。

/Pages
    ┣ Index.cshtml ・・・「/」に対応
    ┗ /Animals
        ┣ Index.cshtml ・・・「/Animals」に対応
        ┣ Create.cshtml ・・・「/Animals/Create」に対応
        ┣ Edit.cshtml ・・・「/Animals/Edit」に対応
        ┗ /Dog
            ┣ Index.cshtml ・・・「/Animals/Dog」に対応
            ┗ Delete.cshtml ・・・「/Animals/Dog/Delete」に対応

ページとページモデルの分離

 先ほど作成したIndex.cshtmlでは、ページモデルクラスをfunctionsディレクティブに記述していました。これは小規模なアプリケーションを素早く作成したい際に有用ですが、実際のアプリケーション開発ではcshtmlファイルが煩雑化していってしまうので、役割に応じてページとページクラスでファイルを分割しましょう。「Pages」ディレクトリの直下に「Index.cshtml.cs」というファイルを作成し、Index.cshtmlのfunctionsディレクティブに記載していたクラスを移し替えます。

リスト4 ページモデルクラス(Index.cshtml.cs)
using System;
using Microsoft.AspNetCore.Mvc.RazorPages;

namespace Sample.RazorPages.Pages
{
    public class IndexModel : PageModel
    {
        public string Message { get; set; }

        public IndexModel() {}

        public void OnGet()
        {
            var now = DateTime.Now.ToString();

            Message += $"現在時刻: {now}";
        }
    }
}

 Index.cshtmlからは、functionsディレクティブとusingディレクティブの行(4行目)を削除します。この状態で「dotnet run」を実行して、先ほどと同じ結果が表示されれば成功です。

 なお、ページモデルクラスには以下のルールがあるので覚えておきましょう。

  • クラス名は「ページ名(ここではIndex)」 + 「Model」となること。
  • ページモデルクラスはページと同じ名前空間に存在すること。
  • ページモデルクラスを単体テストするためには、コンストラクタを明示的に記述する必要があること。

次のページ
Razor Pagesアプリケーションを作成しよう(3)

この記事は参考になりましたか?

進化した「ASP.NET Core 2.0」新しいWeb開発手法を学ぶ連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 秋葉 龍一(アキバ リュウイチ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/10515 2017/11/21 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー