了解です。
前回のモデルとサンプルデータを、さらに 多言語対応 と SEO向け設定 を組み込んだ形にリファインします。
今回の改良点は以下です。
- 多言語対応:
TitleEn / DescriptionEn を追加し、英語表示にも対応 - SEO対応:
Slug プロパティを追加し、URL生成やSEO最適化に利用可能 - IsVisibleInMenu を追加し、メニューには表示しないが直接アクセス可能なページを制御
- サンプルデータを多言語・SEOを意識した形に変更
モデル例(Menu.cs)
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)
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