記事目次
- ASP.NET Core 3.0 Razor Pages 事始め(1) - はじめてのRazor Pagesアプリケーション
- ASP.NET Core 3.0 Razor Pages 事始め(2) - スキャフォールディングとDBマイグレーション
- ASP.NET Core 3.0 Razor Pages 事始め(3) - マイグレーションのやり直しとURLルーティング <-- この記事
- ASP.NET Core 3.0 Razor Pages 事始め(4) - ページモデルとページハンドラ
- ASP.NET Core 3.0 Razor Pages 事始め(5) - Postページハンドラとタグヘルパー
- ASP.NET Core 3.0 Razor Pages 事始め(6) - データベースに初期値を設定する
- ASP.NET Core 3.0 Razor Pages 事始め(7) - Viewの変更とコンカレンシー例外処理
- ASP.NET Core 3.0 Razor Pages 事始め(8) - 検索機能の追加
- ASP.NET Core 3.0 Razor Pages 事始め(9) - ページに新しいフィールドを追加する
- 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
無事、/Movies/Index ページが起動できました。
SQLiteで本格的にアプリ開発するとき(そんなケースはあまりないと思いますが)はちょっと工夫が必要そうです。
URLルーティング
ちょっと、ここで、RazorPagesのURLルーティングがどうなっているかを少し見てみます。
アプリを起動し、Privacy のリンクをクリックします。するとPrivacyページが開きます。この時の URLは、
https://localhost:5001/Privacy
です。
ページ名が、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 ページをやっていこうと思います。