Конфигурация маршрута для динамических URL

Поэтому я работаю над приложением MVC 4. Моя проблема для определенного контроллера, URL может быть http://domain/category/clothing/1256 или это может быть http://domain/category/clothing/shirts/formal/128". Как вы можете видеть глубину изменения URL-адреса, но все должны быть направлены на контроллер категории.

Так как максимальная глубина URL не известна, я не могу использовать User Routeconfig, так как не знаю, когда появятся параметры.

routes.MapRoute(
    name: "Category",
    url: "Category/{ignore}/{id}/{SubCatId}/{SubSubCatId}",
    defaults: new { controller = "Category", action = "Index", CatId = UrlParameter.Optional, SubCatId = UrlParameter.Optional, SubSubCatId = UrlParameter.Optional },
    namespaces: new[] { "CSPL.B2C.Web.Controllers" },
    constraints: new { id = @"\d+" }
);

Приведенный выше код не будет работать, поскольку он учитывает только один уровень. Любые идеи о том, как этого добиться

Индексный метод контроллера категорий

public ActionResult Index(string id, string SubCatId, string SubSubCatId)
{
    return view();
}

1 ответ

Решение

Ваш единственный вариант - универсальный параметр. Тем не менее, есть две оговорки с этим:

  1. Всеобщий параметр должен быть последней частью маршрута
  2. Универсальный параметр проглотит все, включая /, так что вам придется вручную анализировать отдельные биты, которые вам нужны, с помощью регулярного выражения или чего-то еще.

По сути, вы просто измените маршрут на:

routes.MapRoute(
    name: "Category",
    url: "Category/{*path}",
    defaults: new { controller = "Category", action = "Index" },
    namespaces: new[] { "CSPL.B2C.Web.Controllers" }
);

Затем, ваше действие должно быть изменено, чтобы принять этот новый параметр:

public ActionResult Index(string path)
{
    // parse path to get the data you need:

    return view();
}
Другие вопросы по тегам