Pergunta

Eu quero uma rota com dois argumentos opcionais; Pensei o seguinte iria funcionar:

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

Mas só funciona quando ambos vendor_id e category_id são fornecidos; usando RouteDebug vejo que /products/create/_3 não aciona minha rota, então eu adicionei outras duas rotas:

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

Assim, as perguntas:

  • Está usando três rotas a única maneira de fazer uma rota com os argumentos opcionais?

  • São estas URLs ok ou não, isto é, que você sugeriria uma maneira melhor de fazer isso?

Foi útil?

Solução

Por que você não tentar dar vendor_id um valor padrão (se não for especificado ou seja 0), que iria ajudá-lo a fugir com uma rota

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

Outras dicas

parece ser bom para mim, mas eu faria um pouco diferente:

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

);

e

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

);

, em seguida, sua classe pode ser a seguinte:

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

mas isso é apenas me

Você pode experimentá-lo como este:

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

Então você teria que criar alguma lógica em seu método ActionResult para verificar arg1 e arg2 e identificar argumento wich foi passado.

URLs actionlink ficaria assim:

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

Pessoalmente eu não gosto este como o caminho não parece muito limpo, mas deve dar-lhe o que eu acho que o seu olhando para conseguir?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top