ユーザーが独自のSEOURL(Wordpressなど)を作成できるように、CMSのページにカスタムスラッグを作成したいと思います。
私はこれをRubyonRailsとPHPフレームワークで、404ルートを「悪用」することで行っていました。このルートは、要求されたコントローラーが見つからなかったときに呼び出され、ユーザーを動的ページコントローラーにルーティングしてスラッグを解析できるようにしました(ページが見つからなかった場合は、そこから実際の404にリダイレクトしました)。このように、データベースは要求されたスラッグをチェックするためだけに照会されました。
ただし、MVCでは、キャッチオールルートは、ルートがデフォルトルートのに適合しない場合にのみ呼び出されます/{controller}/{action}/{id}
。
カスタムスラッグを解析できるようにするために、RouteConfig.cs
ファイルを変更しました。
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
RegisterCustomRoutes(routes);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { Controller = "Pages", Action = "Index", id = UrlParameter.Optional }
);
}
public static void RegisterCustomRoutes(RouteCollection routes)
{
CMSContext db = new CMSContext();
List<Page> pages = db.Pages.ToList();
foreach (Page p in pages)
{
routes.MapRoute(
name: p.Title,
url: p.Slug,
defaults: new { Controller = "Pages", Action = "Show", id = p.ID }
);
}
db.Dispose();
}
}
これで私の問題は解決しPages
ますが、リクエストごとにテーブルを完全に照会する必要があります。オーバーロードされたshowメソッド(public ViewResult Show(Page p)
)が機能しなかったため、ページIDしか渡せないため、もう一度ページを取得する必要があります。
- 私の問題を解決するためのより良い方法はありますか?
- ページIDの代わりにPageオブジェクトをShowメソッドに渡すことは可能ですか?