問題
私のプロジェクトでは、データベースに格納されたエンティティ「セクション」を使用してカスタム メニュー プロバイダーを実装することにしました。したがって、セクションは次のモデルにマップされます。
public class TopMenuItemModel : BaseTrivitalModel
{
public TopMenuItemModel()
{
ChildItems = new List<TopMenuItemModel>();
}
public int ItemId { get; set; }
public string RouteUrl { get; set; }
public string Title { get; set; }
public string SeName { get; set; }
public IList<TopMenuItemModel> ChildItems { get; set; }
}
モデルのビュー:
@model TopMenuModel
<nav id="main-nav">
<a href="@Url.RouteUrl("HomePage")">@T("HomePage")</a>
@foreach (var parentItem in Model.MenuItems)
{
<a href="@Url.RouteUrl("Section", new { seName = parentItem.SeName, sectionId = parentItem.ItemId })">@parentItem.Title</a>
}
</nav>
私のデフォルトルートは次のとおりです。
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional },
new[] { "Trivital.Web.Controllers" }
);
メニューのコントローラー:
public class CommonController : BaseTrivitalController
{
...
public ActionResult TopMenu()
{
var sections = _sectionService.GetCollectionByParentId(0, true);
var model = new TopMenuModel();
model.MenuItems = sections.Select(x =>
{
var item = new TopMenuItemModel()
{
ItemId = x.Id,
Title = x.GetLocalized(s => s.Title, _workContext.WorkingLanguage.Id, true, true),
SeName = x.GetSeName(),
RouteUrl = "",
};
return item;
})
.ToList();
return PartialView(model);
}
}
}
これで、ActionResult メソッドを持つ SectionController ができました。
//section main page
public ActionResult Section(string seName)
{
var section = _sectionService.Get(1);
if (section == null || section.Deleted || !section.Published)
return RedirectToAction("Index", "Home");
//prepare the model
var model = PrepareSectionPageModel(section);
return View(model);
}
セクションの現在のルート (これにより、host/sectionSeName-id が得られます):
routes.MapLocalizedRoute(
"section", // Route name
"{SeName}"+ "-" + "{sectionId}", // URL with parameters
new { controller = "Sections", action = "Section" },
new { sectionId = @"\d+" }
);
ここで、URL を次のようにする必要があります (ID なし、セクション名のみ):
ホスト/セクションSeName
URLにIDを非表示にして、URLをSEOフレンドリーに見せますが、コントローラーで使用できるようにする方法はありますか?