Конфигурация маршрута для динамических 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 ответ
Ваш единственный вариант - универсальный параметр. Тем не менее, есть две оговорки с этим:
- Всеобщий параметр должен быть последней частью маршрута
- Универсальный параметр проглотит все, включая
/
, так что вам придется вручную анализировать отдельные биты, которые вам нужны, с помощью регулярного выражения или чего-то еще.
По сути, вы просто измените маршрут на:
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();
}