2011-01-12 6 views
5

En primer lugar, soy nuevo en MVC, por lo que le pido disculpe si es básico.Obtener valor de parámetro nulo en el controlador cuando se activa una ruta MVC

Estoy usando una ruta personalizada para crear la siguiente URL (http: // mysite/subscriber/12345) donde 12345 es el número de abonado. Quiero que ejecute la acción ShowAll en el controlador Suscriptor. Mi ruta se está disparando y usando Phil's route debugger, cuando paso en la url anterior, el depurador de ruta muestra ID como 12345.

Mi controlador acepta un int como subscriptionerID. Cuando se dispara, el controlador arroja el error "El diccionario de parámetros contiene una entrada nula para el parámetro 'id' de tipo no nulo 'System.Int32". ¿Por qué el depurador de ruta muestra un valor y el controlador no lo ve?

Aquí es mi ruta (el primero es el culpable)

routes.MapRoute(
       "SubscriberAll", 
       "subscriber/{id}", 
       new { controller = "Subscriber", action = "ShowAll", id=0 }, 
       new { id = @"\d+" } //confirm numeric 
      ); 

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

Alguna idea de por qué estoy recibiendo un nulo en la acción ShowAll? Aquí está la firma del método de acción:

public ActionResult ShowAll(int id) 
+0

¿Puede publicar todos los registros de rutas junto con la firma del método de acción? –

+0

Sí. Actualizó la pregunta. –

+0

Creo que el problema está en tu restricción. No soy un ninja regex, así que no puedo ayudarte allí. –

Respuesta

5

encontró que la firma del método controlador necesita para aceptar una cadena como MVC no sabe qué escriba el parámetro que pasa y, por lo tanto, no puede convertirlo a int, pero puede aplicarlo a través de la restricción.

Por lo tanto, la ruta que terminó con es la siguiente:

routes.MapRoute ( "SubscriberAll", "suscriptor/{id}", nuevo controlador = { "Suscriptor", la acción = "ShowAll"}, new {id = @ "\ d +"} // confirma el número );

y la firma del método controlador terminé con esta es

public ActionResult ShowAll(string id) 
+2

Eso no es preciso; de hecho, MVC intenta analizar cualquier cadena que pase en la url a int. El uso de ActionResult ShowAll público (ID de cadena) + nuevo {controller = "Home", action = "Index", id = UrlParameter.Optional} debería funcionar siempre que el parámetro id sea de tipo int y se llame id, nada más como personId. – usefulBee

+1

@usefulBee: gracias por escribir _ "y llamé id, nada más como personId" _, me acabo de dar cuenta de que cometí este error en mi código, y ahora me siento como un idiota, pero mi problema está resuelto. : D Gracias.Creo que deberías publicarlo como una respuesta separada (al menos obtendrías un voto favorable de mi parte). – Sk8erPeter

+1

Omg, sin querer, cambié el nombre del parámetro de id a uno más específico, y eso rompió el enrutamiento. –

1

Identificación Prueba a eliminar de la lista de incumplimientos es decir, justo tienen

new { controller = "Subscriber", action = "ShowAll" } 
+0

Sigue recibiendo el error. Quiero que se requiera la identificación. –

+0

@ asp316 actualizó mi respuesta – Vadim

1

En lugar de escribir "id = 0" en su MapRoute escritura "id = UrlParameter.Optional"

esto definitivamente trabajar con su resultado de acción

public ActionResult ShowAll(int id) 

routes.MapRoute(
        "SubscriberAll", 
        "subscriber/{id}", 
        new { controller = "Subscriber", action = "ShowAll", id = UrlParameter.Optional }, 
        new { id = @"\d+" } //confirm numeric 
       ); 
Cuestiones relacionadas