asp.net mvc сложная маршрутизация для дерева пути - PullRequest
12 голосов
/ 21 июня 2009

Мне интересно, как я могу определить карту маршрутизации следующим образом:

{TreePath}/{Action}{Id} 

TreeMap динамически загружается из базы данных следующим образом:

 'Gallery/GalleryA/SubGalleryA/View/3'

Ответы [ 4 ]

13 голосов
/ 21 июня 2009

Вы можете создать собственный обработчик маршрута для этого. Фактический маршрут является универсальным:

routes.MapRoute(
    "Tree",
    "Tree/{*path}",
    new { controller = "Tree", action = "Index" })
        .RouteHandler = new TreeRouteHandler();

Обработчик дерева просматривает путь, извлекает последнюю часть как действие и затем перенаправляет на контроллер. Часть действия также удаляется с пути. Добавление части {id} должно быть простым.

public class TreeRouteHandler : IRouteHandler
{
    public IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        string path = requestContext.RouteData.Values["path"] as string;

        if (path != null)
        {
            int idx = path.LastIndexOf('/');
            if (idx >= 0)
            {
                string actionName = path.Substring(idx+1);
                if (actionName.Length > 0)
                {
                    requestContext.RouteData.Values["action"] = actionName;
                    requestContext.RouteData.Values["path"] = 
                        path.Substring(0, idx);
                }
            }
        }

        return new MvcHandler(requestContext);
    }
}

Ваш контроллер будет работать так, как вы ожидаете:

public class TreeController : Controller
{
    public ActionResult DoStuff(string path)
    {
        ViewData["path"] = path;
        return View("Index");
    }
}

Теперь вы можете называть URL как /Tree/Node1/Node2/Node3/DoStuff. Путь, который получает действие: Node1/Node2/Node3

2 голосов
/ 16 декабря 2009

У вас может быть «жадная» часть в строке запроса, если у вас есть фиксированные части после нее, например,

/{*TreePath}/Edit/{id}
/{*TreePath}/Action/{id}

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

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

2 голосов
/ 21 июня 2009

Можете ли вы переключить URL? Если вы можете сделать свой параметр {TreePath} в качестве последнего параметра, вы можете легко сделать это с одним маршрутом.

   routes.MapRoute("TreeRoute", 
                    "{Action}/{id}/{*TreePath}", 
                    new TreeRouteHandler()));

Параметр подстановочного знака должен быть последним параметром.

В противном случае, я думаю, вы застрянете с необходимостью определить несколько параметров, по одному для каждого возможного раздела URL-адреса TreeMap.

Обратите внимание, что вы никогда не можете определить два параметра маршрутизации вместе без какого-либо буквального текста между ними. Другими словами, вы можете определить {Action}/{Id}, но вы можете никогда определить {Action}{Id}. Механизм маршрутизации не может знать, где заканчивается один параметр и начинается следующий при сопоставлении с образцом.

1 голос
/ 16 октября 2009

Я новичок в MVC, но одним из требований была эта опция. Я vb-er, поэтому у меня возникли проблемы с преобразованием кода, но я заставил его работать, и хотел предложить пример решения: www.proovit.com / Скачать / MvcApplication1.zip Это простой стандартный проект MVC, я пропустил код и bin, но вы можете скопировать их из стандартного проекта.

o, вы должны использовать теги app / bla / bla / bla для индекса и app / trade / order / view для страницы заказа.

...