Пользовательские маршруты ASP.NET MVC с необязательными аргументами - PullRequest
1 голос
/ 10 сентября 2009

Мне нужен маршрут с двумя необязательными аргументами; Я думал, что будет работать следующее:

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 в порядке или нет, то есть, вы бы предложили лучший способ сделать это?

Ответы [ 3 ]

1 голос
/ 10 сентября 2009

Почему бы вам не попытаться присвоить 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" });
0 голосов
/ 10 сентября 2009

вы можете попробовать это так:

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-адреса actionlink будут выглядеть так:

/products/create/vendor/10
/products/create/category/20
/products/create/vendor/10/category/20
/products/create/category/20/vendor/10

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

0 голосов
/ 10 сентября 2009

выглядит хорошо для меня, но я бы сделал это немного по-другому:

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}

но это только я

...