記事詳細


投稿日
2026年09月29日19時51分
タイトル

ASP.NET Core MVC: MVCアプリでメニューを、データベースのデータから階層ドロップダウンで表示する場合のモデルのサンプルデータを教えてください。

内容

了解です。
前回のモデルとサンプルデータを、さらに 多言語対応 と SEO向け設定 を組み込んだ形にリファインします。
今回の改良点は以下です。

  • 多言語対応:TitleEn / DescriptionEn を追加し、英語表示にも対応
  • SEO対応:Slug プロパティを追加し、URL生成やSEO最適化に利用可能
  • IsVisibleInMenu を追加し、メニューには表示しないが直接アクセス可能なページを制御
  • サンプルデータを多言語・SEOを意識した形に変更

モデル例(Menu.cs)

Csharp
using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace MyApp.Models { /// <summary> /// 階層型メニュー項目モデル(多言語・SEO対応) /// </summary> public class Menu { [Key] public int Id { get; set; } [Required] [MaxLength(100)] public string Title { get; set; } [MaxLength(100)] public string TitleEn { get; set; } [MaxLength(200)] public string Url { get; set; } /// <summary> /// SEO用スラッグ(URL生成に利用) /// </summary> [MaxLength(100)] public string Slug { get; set; } public int SortOrder { get; set; } = 0; public bool IsActive { get; set; } = true; /// <summary> /// メニューに表示するかどうか(falseなら直接アクセスのみ) /// </summary> public bool IsVisibleInMenu { get; set; } = true; [MaxLength(50)] public string IconClass { get; set; } [MaxLength(250)] public string Description { get; set; } [MaxLength(250)] public string DescriptionEn { get; set; } [MaxLength(20)] public string Target { get; set; } = "_self"; [MaxLength(50)] public string PermissionKey { get; set; } public int? ParentId { get; set; } [ForeignKey("ParentId")] public Menu Parent { get; set; } public ICollection<Menu> Children { get; set; } = new List<Menu>(); } }

サンプルデータ(Seed)

Csharp
using Microsoft.EntityFrameworkCore; using MyApp.Models; namespace MyApp.Data { public class AppDbContext : DbContext { public DbSet<Menu> Menus { get; set; } public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { } protected override void OnModelCreating(ModelBuilder modelBuilder) { // トップレベルメニュー modelBuilder.Entity<Menu>().HasData( new Menu { Id = 1, Title = "ホーム", TitleEn = "Home", Url = "/", Slug = "home", SortOrder = 1, IsActive = true, IsVisibleInMenu = true, IconClass = "fa fa-home", Description = "サイトのトップページ", DescriptionEn = "Website home page", Target = "_self", PermissionKey = "Guest" }, new Menu { Id = 2, Title = "サービス", TitleEn = "Services", Url = "/services", Slug = "services", SortOrder = 2, IsActive = true, IsVisibleInMenu = true, IconClass = "fa fa-cogs", Description = "提供サービス一覧", DescriptionEn = "List of services", Target = "_self", PermissionKey = "User" }, new Menu { Id = 3, Title = "ブログ", TitleEn = "Blog", Url = "/blog", Slug = "blog", SortOrder = 3, IsActive = true, IsVisibleInMenu = true, IconClass = "fa fa-blog", Description = "最新ニュースと記事", DescriptionEn = "Latest news and articles", Target = "_self", PermissionKey = "Guest" } ); // 子メニュー(サービス) modelBuilder.Entity<Menu>().HasData( new Menu { Id = 4, Title = "Web開発", TitleEn = "Web Development", Url = "/services/web", Slug = "web-development", SortOrder = 1, ParentId = 2, IsActive = true, IsVisibleInMenu = true, IconClass = "fa fa-code", Description = "Webアプリ開発", DescriptionEn = "Web application development", Target = "_self", PermissionKey = "User" }, new Menu { Id = 5, Title = "モバイルアプリ", TitleEn = "Mobile Apps", Url = "/services/mobile", Slug = "mobile-apps", SortOrder = 2, ParentId = 2, IsActive = true, IsVisibleInMenu = true, IconClass = "fa fa-mobile", Description = "スマホアプリ開発", DescriptionEn = "Mobile application development", Target = "_self", PermissionKey = "User" } ); // 孫メニュー(Web開発) modelBuilder.Entity<Menu>().HasData( new Menu { Id = 6, Title = "フロントエンド", TitleEn = "Frontend", Url = "/services/web/frontend", Slug = "frontend", SortOrder = 1, ParentId = 4, IsActive = true, IsVisibleInMenu = true, IconClass = "fa fa-desktop", Description = "UI/UX設計", DescriptionEn = "UI/UX design", Target = "_self", PermissionKey = "User" }, new Menu { Id = 7, Title = "バックエンド", TitleEn = "Backend", Url = "/services/web/backend", Slug = "backend", SortOrder = 2, ParentId = 4, IsActive = true, IsVisibleInMenu = true, IconClass = "fa fa-server", Description = "API・DB構築", DescriptionEn = "API and database development", Target = "_self", PermissionKey = "User" } ); } } }

改良ポイント

  • 多言語対応:TitleEn / DescriptionEn により、UI言語切替が可能。
  • SEO対応:Slug を使ってクリーンURL生成や検索エンジン最適化が可能。
  • IsVisibleInMenu により、メニュー非表示ページ(LPやキャンペーンページなど)も管理可能。
  • サンプルデータは日本語・英語両方を含み、国際化対応サイトを想定。

このバージョンを使えば、多言語対応の階層ドロップダウンメニューを構築できます。
もし希望があれば、このモデルを使った 言語切替対応の Razor View 実装例 も提示できます。

次はこの多言語モデルを使って、言語切替付き階層ドロップダウン描画コードを作りますか?

Powered by Froala Editor

添付画像

画像はありません
Genreのカテゴリ-名
Views
編集 | 記事一覧