Подтвердить что ты не робот

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

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

{TreePath}/{Action}{Id} 

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

 'Gallery/GalleryA/SubGalleryA/View/3'
4b9b3361

Ответ 1

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

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

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

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

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

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

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

Ответ 3

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

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

Ответ 4

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

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

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

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