Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

ASP.NET Core 3.0 Razor Pages 事始め(3) - マイグレーションのやり直しとURLルーティング

More than 1 year has passed since last update.

記事目次

  1. ASP.NET Core 3.0 Razor Pages 事始め(1) - はじめてのRazor Pagesアプリケーション
  2. ASP.NET Core 3.0 Razor Pages 事始め(2) - スキャフォールディングとDBマイグレーション
  3. ASP.NET Core 3.0 Razor Pages 事始め(3) - マイグレーションのやり直しとURLルーティング <-- この記事
  4. ASP.NET Core 3.0 Razor Pages 事始め(4) - ページモデルとページハンドラ
  5. ASP.NET Core 3.0 Razor Pages 事始め(5) - Postページハンドラとタグヘルパー
  6. ASP.NET Core 3.0 Razor Pages 事始め(6) - データベースに初期値を設定する
  7. ASP.NET Core 3.0 Razor Pages 事始め(7) - Viewの変更とコンカレンシー例外処理
  8. ASP.NET Core 3.0 Razor Pages 事始め(8) - 検索機能の追加
  9. ASP.NET Core 3.0 Razor Pages 事始め(9) - ページに新しいフィールドを追加する
  10. ASP.NET Core 3.0 Razor Pages 事始め(10) - 検証機能の追加


前回ASP.NET Core 3.0 Razor Pages 事始め(2)の続きです。

今回はちょっと寄り道です。

DBContextの プロパティ名を変更する

RazorPagesMovieContextクラスのソース見直していたら、

public DbSet<RazorPagesMovie.Models.Movie> Movie { get; set; }

とプロパティ名が単数形になってます。僕のタイプミスかなと思ったのですが、チュートリアルのコードが単数形になっていました。

やはり、複数形にしたいです。
ということで、Moviesと複数形に直したいと思います。

public DbSet<RazorPagesMovie.Models.Movie> Movies { get; set; }

これを参照している個所(cshtml ファイルも含めて)Movies に変更します。

Index.cshtml.cs 内の、Movie プロパティも Movies に変更します。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.EntityFrameworkCore;
using RazorPagesMovie.Data;
using RazorPagesMovie.Models;

namespace RazorPagesMovie.Pages.Movies
{
    public class IndexModel : PageModel
    {
        private readonly RazorPagesMovie.Data.RazorPagesMovieContext _context;

        public IndexModel(RazorPagesMovie.Data.RazorPagesMovieContext context)
        {
            _context = context;
        }

        public IList<Movie> Movies { get;set; }

        public async Task OnGetAsync()
        {
            Movies = await _context.Movies.ToListAsync();
        }
    }
}

併せて、Index.cshtml 内も変更します。

これで、ビルドし直し、F5キーで実行し、次のURLにアクセスします。

https://localhost:5001/Movies

あれ、 以下のようなエラーページが出てしまいました。

An unhandled exception occurred while processing the request.

SqliteException: SQLite Error 1: 'no such table: Movies'.
Microsoft.Data.Sqlite.SqliteException.ThrowExceptionForRC(int rc, sqlite3 db)

ああ、データベースのテーブル名と一致しないのでダメなんですね。

SQLiteでのDBマイグレーション?

ということで、もう一回マイグレーションを実施します。

dotnet ef migrations add renameMoviesTable
dotnet ef database update

とやれば、できると思ったのですが、SQLiteでは制限があるようで失敗します。

なので、MvcMovie.db ファイルを削除後、Migrationsフォルダ以下を全て削除します。

それから以下のコマンドを再度実行します。

dotnet ef migrations add InitialCreate
dotnet ef database update

MvcMovie.db ファイルが再度作成されたことを確認後、F5キーで実行します。

直接、以下のURLにアクセスします。

https://localhost:5001/Movies

スクリーンショット 2019-10-27 10.10.18.png

無事、/Movies/Index ページが起動できました。

SQLiteで本格的にアプリ開発するとき(そんなケースはあまりないと思いますが)はちょっと工夫が必要そうです。

URLルーティング

ちょっと、ここで、RazorPagesのURLルーティングがどうなっているかを少し見てみます。

アプリを起動し、Privacy のリンクをクリックします。するとPrivacyページが開きます。この時の URLは、

https://localhost:5001/Privacy

です。

スクリーンショット 2019-10-27 15.16.25.png

ページ名が、URLと対応しているのが分かります。

ちなみに、Startページ(index.cshtml)のURLは、

https://localhost:5001/

です。
プロジェクトのソースコードのどこを見ても、indexがデフォルトのページだという指定はありませんでした。
これはフレームワーク側で決めているようです。

当然ですが、ブラウザで、

https://localhost:5001/index

とURLを直接指定した場合も、indexページが表示されました。

さきほどの、MoviesのIndexページのURLも

https://localhost:5001/Movies

で、Movies/Index.cshtml が開きます。Createページの URLは、

https://localhost:5001/Movies/Create

です。実にわかりやすいです。

Pagesフォルダーに新たなフォルダを作成し、

/Pages/Sample/Hello.cshtml

というページを作成すれば、URLは、

https://localhost:5001/Sample/Hello 

となります。フォルダ階層がURLのパスと一致するので、とても分かりやすいです。

表にまとめてみました。

ファイル名とパス 一致するURL
/Pages/Index.cshtml / または /Index
/Pages/Privacy.cshtml /Privacy
/Pages/Movies/Create.cshtml /Movies/Create
/Pages/Movies/Index.cshtml /Movies または /Movies/Index

今回は少し寄り道をしてしまいましたが、次回は、公式チュートリアルのASP.NET Core でスキャフォールディングされた Razor ページをやっていこうと思います。

gushwell
株式会社ジード / Microsoft MVP for Developer Technologies 2005-2020 / 著書『実戦で役立つ C#プログラミングのイディオム/定石&パターン』『新・標準プログラマーズライブラリ なるほどなっとく C#入門』『C#プログラミング入門―オブジェクト指向のプログラミング手法を基礎から解説』
https://github.com/gushwell
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away