13

He estado trabajando en una gran aplicación MVC durante el último mes, pero esta es la primera vez que necesito definir un controlador de ruta personalizado, y tengo algunos problemas. Básicamente tengo dos parámetros para pasar. El primero es obligatorio y el segundo es opcional.Enrutamiento ASP.NET MVC con un parámetro obligatorio y un parámetro opcional?

Yo sigo a esta respuesta here.

Aquí es mi ruta personalizada:

routes.MapRoute(
    "MyRoute", 
    "{controller}/{action}/{param1}/{param2}", 
    new { 
     controller = "MyController", 
     action = "MyAction", 
     param1 = "", 
     param2 = "" // I have also tried "UrlParameter.Optional" here. 
    } 
); 

Y mi método de acción firma:

public ActionResult MyAction(string param1, string param2) 

Si trato de la URL http://[myserver]/MyController/MyAction/Test1/Test2 entonces funciona como espero que, con param1 = "Prueba1 "y param2 =" Test2 "

Si pruebo la URL http://[myserver]/MyController/MyAction/Test1, entonces ambos parámetros son nulos.

Espero que alguien pueda decirme qué estoy haciendo mal aquí, porque estoy perdido.

+0

Hola desde el futuro - tratar de atribuir enrutamiento ahora - manera de la manera más fácil y menos propenso a errores – niico

Respuesta

13

Asumo que creó nueva ruta y el izquierdo por defecto que es muy similar a la suya. Debe tener en cuenta que se atraviesa la recopilación de rutas para encontrar la primera ruta coincidente. Así que si te queda la opción por defecto:

routes.MapRoute(
      "Default", // Route name 
      "{controller}/{action}/{id}", // URL with parameters 
      new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults 
     ); 

por encima de su ruta, entonces coincidirá con solicitud a http://[myserver]/My/MyAction/Test1 y llame MyController.MyAction y ajuste "Text1" al parámetro denominado id. Lo cual fallará porque esta acción no declara uno llamado id.

Lo que hay que hacer es mover su ruta como primero en la lista de rutas y hacerla más específica a continuación, lo que es ahora:

routes.MapRoute(
      "Route", 
      "My/{action}/{param1}/{param2}", 
      new 
      { 
       controller = "My", 
       action = "MyAction", 
       param1 = "", 
       param2 = "" 
      }); 

Esto obligará a todo el tráfico encaminado a través My para que coincida con esta ruta.

+1

No importa lo que haga, no puedo obtener múltiples parámetros para trabajar en la ruta de esta manera. Si intento crear 2 parámetros y solicito la página con una URL como 'Mi/MiAcción/param1/param2', aparece un error 404. ¿Qué estoy haciendo mal? – DavidHyogo

1

hi usted crea su derrota como esta, creo que este será hep que

routes.MapRoute(
       "Regis", // Route nameRegister 
       "Artical/{id}", // URL with parameters 
       new { controller = "Artical", action = "Show", id = UrlParameter.Optional } // Parameter defaults 
      ); 
0

Prueba este

routes.MapRoute("MyRoute", 
       "myRoute/{param1 }/{param2 }", 
       new { controller = "MyController", action = "MyAction", param2 = UrlParameter.Optional }, 
       new { param2 = @"\w+" }); 

puede especificar un parámetro opcional como mediante el uso de "UrlParameter.Optional" y se especifique otra con DataType significa que si se pasa un valor entero a continuación Tipo de datos (@ "\ d +") y para la cadena he mencionado anteriormente.

NOTA: Secuencia del parámetro es muy importante parámetro opcional debe pasar al fin yregistrar su nueva ruta Antes de ruta por defecto En Gloab.asax.

entonces Enlace de acción como

<a href="@Url.RouteUrl("MyRoute", new { param2 = "Test1",param1 = "Test2"})">Test</a> 

O con un parámetro

<a href="@Url.RouteUrl("MyRoute", new { param2 = "Test1"})">Test</a> 

En ti controlador

public ActionResult MyAction(string param2,string param1) 
{ 
    return View() 
} 
Cuestiones relacionadas