Asp.net MVC комплексная маршрутизация для дерева пути

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

{TreePath}/{Action}{Id} 

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

 'Gallery/GalleryA/SubGalleryA/View/3'

4 ответа

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

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

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам