问题
在我的项目中,我决定使用db存储实体“Section”来复制自定义菜单提供程序。 因此该部分映射到以下模型:
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);
}
}
}
现在我有一个SectionController,我有一个ActionResult方法:
//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,只是部分名称):
主机/ sectionSeName
无论如何都要隐藏网址中的ID以使网址看起来对搜索引擎优化友好,但可用于控制器?
答案 0 :(得分:1)
您可以尝试使用web.config中的urlMappings。指定如下内容:
<urlMappings enabled="true">
<add url="~/somedirectory/" mappedUrl="~/somedirectory/1/"/>
</urlMappings>
尽管如此,除非每个部分都有自己独特的名称,否则我认为没有任何作用。否则你会有一些有冲突的网址。
您可能还想考虑使用IIS的重写模块进行一些自定义工作:
http://www.iis.net/learn/extensions/url-rewrite-module/using-the-url-rewrite-module
我工作的公司使用它的KB文章系统,这与你的情况类似,而且效果很好。 (文件夹/ id)的