2016-07-01 9 views
1

Mvc 5, .Net 4.5mvcsitemapprovider - Переход к одной и той же ActionResult с разных страниц

я реализую MvcSiteMapNodeAttribute следующим образом:

[MvcSiteMapNode(Title="Running Events", ParentKey="Events", Key="RunningEvents")] 
public ActionResult RunningEvents() 
{ 
    return View(); 
} 

Мне нужно получить доступ к этой странице из нескольких мест и держать сухари в (т. е. от правильного метода вызова). Однако ParentKey диктует, откуда происходит звонок, и, таким образом, установить на нем ParentNode. Это не идеально, поскольку я хочу, чтобы вызывающий ActionResult был родительским, а не «жестко закодированным», как с решением ParentKey. ParentKey также не редактируется во время выполнения или ParentNode. Единственный способ в этот момент - дублировать ActionResult с разными сигнатурами и дать ему тот же заголовок, который также не идеален.

Я читал о маршрутизации mvc, DynamicNodeProvider, сопоставлении маршрутов и т. Д., Но не могу найти способ сделать эту работу? Я также не очень хорошо знаком с mvc, поэтому буду признателен за некоторые рекомендации.

Благодаря

ответ

0

Смотрите документацию Multiple Navigation Paths to a Single Page.

Вы можете использовать одно и то же действие контроллера в нескольких местах. Однако вы всегда должны предоставлять уникальный набор значений маршрута (что обычно означает, что каждый URL должен быть уникальным).

Самый естественный способ сделать это - создать URL-адреса с родительской категорией.

routes.MapRoute(
    name: "Category1RunningEvents", 
    url: "Category1/RunningEvents", 
    defaults: new { controller = "Events", action = "RunningEvents", category="Category1" } 
); 

routes.MapRoute(
    name: "Category2RunningEvents", 
    url: "Category2/RunningEvents", 
    defaults: new { controller = "Events", action = "RunningEvents", category="Category2" } 
); 

routes.MapRoute(
    name: "Default", 
    url: "{controller}/{action}/{id}", 
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
); 

А затем дифференцировать согласование маршрута с помощью category поля. Вы можете использовать несколько атрибутов MvcSiteMapNode при одном и том же действии, каждый с разным родительским ключом в SiteMap.

[MvcSiteMapNode(Title="Category 1 Events", ParentKey="Events", Key="RunningEvents", Attributes = @"{ ""category"": ""Category1"" }")] 
[MvcSiteMapNode(Title="Category 2 Events", ParentKey="Category2", Key="Category2RunningEvents", Attributes = @"{ ""category"": ""Category2"" }")] 
public ActionResult RunningEvents() 
{ 
    return View(); 
} 

Конечно, это не единственный способ настройки маршрутизации, но он должен прояснить концепцию. Единственное ограничение заключается в том, что вы должны использовать уникальный набор значений маршрута для соответствия, каждый из которых соответствует узлу. Однако там может быть быть несколькими узлами, которые представляют одно и то же действие контроллера, каждый с другим родительским узлом.

Также см. this answer.

+0

Спасибо за отзыв NightOwl. –