Используя параметры действия в качестве узлов в mvcsitemap
Мой Пользовательский Маршрут:
routes.MapRoute(
name: "custom",
url: "{controller}/{action}/{category}/{subcategory}/{lowcategory}/{id}/{ignore}",
defaults: new { controller = "Home", action = "Index", category = UrlParameter.Optional, subcategory = UrlParameter.Optional, lowcategory = UrlParameter.Optional, id = UrlParameter.Optional,ignore = "" }
);
Mvc.sitemap
является:
<mvcSiteMapNode title="Home" controller="Home" action="Index" preservedRouteParameters="category,subcategory,lowcategory,id,ignore">
<mvcSiteMapNode title="About" controller="Home" action="About"/>
мой Index
функция:
public ActionResult Index(string category, string subcategory, string lowcategory, int? id)
preservedRouteParameters
не показывает узел. Почему?- как показать узлы, как описано ниже.
URL: http://localhost:59328/Home/Index/mobiles
Ожидаемая карта сайта: Home > mobiles
Адрес: http://localhost:59328/Home/Index/mobiles/htc
Ожидаемая карта сайта: Home > mobiles > htc
Адрес: http://localhost:59328/Home/Index/mobiles/htc/m8
Ожидаемая карта сайта: Home > mobiles > htc > m8
Адрес: http://localhost:59328/Home/Index/mobiles/htc/m8/12/title
Ожидаемая карта сайта: Home > mobiles > htc > m8 > title
(идентификатор заметки не включен в карту сайта)
Но фактическая карта сайта всегда Home
1 ответ
Карта сайта - это иерархия. Путь MvcSiteMapProvider
работает, чтобы соответствовать "текущему" узлу, а затем использовать иерархию для построения ссылок на домашнюю страницу. Это похоже на провайдера карты сайта Microsoft в ASP.NET.
Чтобы получить нужную иерархию, вам нужно вложить узлы, как если бы вы работали с папками Windows.
<mvcSiteMapNode title="Home" controller="Home" action="Index">
<mvcSiteMapNode title="Category" controller="Home" action="Index" preservedRouteParameters="category" key="category">
<mvcSiteMapNode title="Subcategory" controller="Home" action="Index" preservedRouteParameters="category,subcategory" key="subcategory">
<mvcSiteMapNode title="Lower Category" controller="Home" action="Index" preservedRouteParameters="category,subcategory,lowercategory" key="lowercategory">
<mvcSiteMapNode title="Title" controller="Home" action="Index" preservedRouteParameters="category,subcategory,lowercategory,id,ignore" key="titleid"/>
</mvcSiteMapNode>
</mvcSiteMapNode>
</mvcSiteMapNode>
<mvcSiteMapNode title="About" controller="Home" action="About"/>
</mvcSiteMapNode>
Кроме того, невозможно использовать более одного дополнительного сегмента в маршруте. Вы должны построить свою маршрутизацию, используя необходимые сегменты.
routes.MapRoute(
name: "ID",
url: "Home/Index/{category}/{subcategory}/{lowercategory}/{id}/{ignore}",
defaults: new { controller = "Home", action = "Index", ignore = UrlParameter.Optional }
);
routes.MapRoute(
name: "LowerCategory",
url: "Home/Index/{category}/{subcategory}/{lowercategory}",
defaults: new { controller = "Home", action = "Index" }
);
routes.MapRoute(
name: "Subcategory",
url: "Home/Index/{category}/{subcategory}",
defaults: new { controller = "Home", action = "Index" }
);
routes.MapRoute(
name: "Category",
url: "Home/Index/{category}",
defaults: new { controller = "Home", action = "Index" }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
Наконец, при использовании preservedRouteParameters
вам нужно проделать дополнительную работу для динамического изменения заголовка в зависимости от URL. Для этого есть атрибут SiteMapTitle, но его текущая реализация не позволяет устанавливать заголовок за текущим узлом и родительским узлом. Так что вам нужно будет сделать что-то вроде этого, чтобы установить заголовок каждого узла:
using MvcSiteMapProvider.Web.Mvc;
public class HomeController : Controller
{
public ActionResult Index(
string category,
string subcategory,
string lowercategory,
int id = 0,
string ignore = "")
{
var currentNode = this.GetCurrentSiteMapNode();
if (currentNode != null)
{
switch (currentNode.Key)
{
case "titleid":
currentNode.Title = ignore;
currentNode.ParentNode.Title = lowercategory;
currentNode.ParentNode.ParentNode.Title = subcategory;
currentNode.ParentNode.ParentNode.ParentNode.Title = category;
break;
case "lowercategory":
currentNode.Title = lowercategory;
currentNode.ParentNode.Title = subcategory;
currentNode.ParentNode.ParentNode.Title = category;
break;
case "subcategory":
currentNode.Title = subcategory;
currentNode.ParentNode.Title = category;
break;
case "category":
currentNode.Title = category;
break;
}
}
ViewBag.Message = "Modify this template to jump-start your ASP.NET MVC application.";
return View();
}
public ActionResult About()
{
ViewBag.Message = "Your app description page.";
return View();
}
}
Обратите внимание, что есть еще один вариант, чем preservedRouteParameters
- вы можете использовать провайдера динамических узлов, чтобы добавить узел для каждой категории, подкатегории, нижней категории и т. д. (и правильно их вложить), тогда каждый узел будет автоматически иметь свой собственный заголовок. Посмотрите, как заставить MvcSiteMapProvider запомнить позицию пользователя для примера.