Domanda

Voglio una route con due argomenti opzionali; Ho pensato che avrebbe funzionato quanto segue:

routes.MapRoute(
    "ProductForm",
    "products/{action}/{vendor_id}_{category_id}",
    new { controller = "Products", action = "Index", vendor_id = "", category_id = "" },
    new { action = @"Create|Edit" }
);

Ma funziona solo quando sono forniti sia vendor_id che category_id ; utilizzando RouteDebug Vedo che / products / create / _3 non attiva il mio percorso, quindi ho aggiunto altri due percorsi:

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" }
);

Quindi, le domande:

  • L'utilizzo di tre route è l'unico modo per creare una route con argomenti facoltativi?

  • Questi URL sono ok o no, cioè suggeriresti un modo migliore per farlo?

È stato utile?

Soluzione

Perché non provi a fornire a vendor_id un valore predefinito (se non è specificato, ovvero 0) che ti aiuterebbe a cavartela con una rotta

routes.MapRoute("ProductForm","products/{action}/{vendor_id}_{category_id}",
new { controller = "Products", action = "Index", vendor_id = "0", category_id = "" },   
new { action = @"Create|Edit" });

Altri suggerimenti

mi sta bene ma lo farei un po 'diversamente:

routes.MapRoute(
"ProductForm1",
"product/category/{category_id}",
new { controller = "Home", action = "Index", category_id = "" },
new { controller = "Products", action = @"Create|Edit" }

);

e poi

 routes.MapRoute(
"ProductForm1",
"product/details/{product_id}",
new { controller = "Home", action = "Index", product_id = "" },
new { controller = "Products", action = @"Create|Edit" }

);

quindi la tua classe può essere la seguente:

ActionResults Index(){}
ActionResults Index(int category_id){// get categories}
ActionResults Index(int product_id){ // get products}

ma sono solo io

potresti provarlo in questo modo:

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" });

Quindi creeresti una logica nel tuo metodo actionresult per verificare arg1 e arg2 e identificare quale argomento è stato passato.

gli URL di Actionlink dovrebbero apparire così:

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

Personalmente non mi piace perché il percorso non sembra molto pulito, ma dovrei darti quello che penso tu voglia raggiungere?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top