Пользовательские маршруты ASP.NET MVC с дополнительными аргументами
-
05-07-2019 - |
Вопрос
Мне нужен маршрут с двумя дополнительными аргументами;Я думал, что следующее будет работать:
routes.MapRoute(
"ProductForm",
"products/{action}/{vendor_id}_{category_id}",
new { controller = "Products", action = "Index", vendor_id = "", category_id = "" },
new { action = @"Create|Edit" }
);
Но это работает только тогда, когда оба vendor_id
и category_id
предоставлены;с использованием RouteDebug
я вижу это /products/create/_3
не запускает мой маршрут, поэтому я добавил еще два маршрута:
routes.MapRoute(
"ProductForm1",
"{controller}/{action}/_{category_id}",
new { controller = "Home", action = "Index", category_id = "" },
new { controller = "Products", action = @"Create|Edit" }
);
routes.MapRoute(
"ProductForm2",
"{controller}/{action}/{vendor_id}_",
new { controller = "Home", action = "Index", vendor_id = "" },
new { controller = "Products", action = @"Create|Edit" }
);
Итак, вопросы:
Является ли использование трех маршрутов единственным способом создать маршрут с необязательными аргументами?
Подходят ли эти URL-адреса или нет, то есть не могли бы вы предложить лучший способ сделать это?
Решение
Почему бы вам не попытаться присвоитьvendor_id значение по умолчанию (если оно не указано, например 0), которое поможет вам обойтись одним маршрутом
routes.MapRoute("ProductForm","products/{action}/{vendor_id}_{category_id}",
new { controller = "Products", action = "Index", vendor_id = "0", category_id = "" },
new { action = @"Create|Edit" });
Другие советы
Мне кажется неплохо, но я бы сделал немного по-другому:
routes.MapRoute(
"ProductForm1",
"product/category/{category_id}",
new { controller = "Home", action = "Index", category_id = "" },
new { controller = "Products", action = @"Create|Edit" }
);
а потом
routes.MapRoute(
"ProductForm1",
"product/details/{product_id}",
new { controller = "Home", action = "Index", product_id = "" },
new { controller = "Products", action = @"Create|Edit" }
);
тогда ваш класс может быть следующим:
ActionResults Index(){}
ActionResults Index(int category_id){// get categories}
ActionResults Index(int product_id){ // get products}
но это только я
вы можете попробовать это так:
routes.MapRoute(
"ProductForm",
"products/{action}/{arg1}/{arg1_id}/{arg2}/{arg2_id}",
new { controller = "Products", action = "Index", arg1 = "", arg2 = "", arg1_id = "", arg2_id = "" },
new { action = @"Create|Edit" });
Затем вы должны создать некоторую логику в своем методе actionresult, чтобы проверить arg1 и arg2 и определить, какой аргумент был передан.
URL-адреса ссылок на действия будут выглядеть так:
/products/create/vendor/10
/products/create/category/20
/products/create/vendor/10/category/20
/products/create/category/20/vendor/10
Лично мне это не нравится, так как маршрут не кажется очень чистым, но он должен дать вам то, чего, я думаю, вы хотите достичь?