2012-01-18 19 views
7

Tengo un controlador llamado Cuenta con una acción con la siguiente firma:MVC Ruta de error: La entrada de restricción 'Longitud'

public ActionResult Verify(string userName, Guid authorisationToken); 

he creado un enlace para llamar a esta acción así:

/Account/Verify/sachin13/409bdaaa-0b65-4bb8-8695-6e430323d8f8 

Cuando voy a este enlace me sale el siguiente error:

The constraint entry 'Length' on the route with URL 'Account/{Verify}/{userName}/{authorisationToken}' must have a string value or be of a type which implements IRouteConstraint. 

esto es lo que mi método RegisterRoutes ve li ke en Global.asax:

public static void RegisterRoutes(RouteCollection routes) 
     { 
      routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

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

      routes.MapRoute(
       "AccountVerify", 
       "Account/{Verify}/{userName}/{authorisationToken}", 
       new { controller = "Account", action = "Verify", userName = "", authorisationToken = "" }, 
       "UI.Controllers" 
      ); 
     } 

Dos preguntas:

  1. estoy haciendo nada fuera de lo normal o es mi metodología aquí en línea con la práctica habitual?

  2. ¿Cuál es el problema aquí?

Gracias,

Sachin

Respuesta

12

debería cambiar

"UI.Controllers"

a

new[] { "UI.Controllers" }

en su segunda ruta.

Si especifica solamente una sola cadena (no una matriz), entonces obtendrá una sobrecarga equivocado de MapRoute función - en lugar de MapRoute(RouteCollection, String, String, Object, String[]) que aceptan una lista de espacios de nombres como último parámetro se obtiene lo que espera MapRoute(RouteCollection, String, String, Object, Object) limitaciones como último parámetro. La cadena "UI.Controllers" no es una especificación de restricción correcta => se obtiene el error.

También como @Pankaj sugirió que su ruta personalizada debe ir antes del valor predeterminado y Verificar debe ser sin "{}".

código completo:

public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute(
      "AccountVerify", 
      "Account/Verify/{userName}/{authorisationToken}", 
      new { controller = "Account", action = "Verify", userName = "", authorisationToken = "" }, 
      new [] { "UI.Controllers" } 
     ); 

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

Sergey, señor - eso fue genial - funcionó. Te debo una cerveza. –

2

declarar siempre la ruta personalizada antes de la ruta por defecto con el fin de hacer que funcione a medida que trabajan en el orden del primero al último. Por lo tanto, debe declarar su segunda ruta antes de la ruta predeterminada y debería resolver el problema, supongo. Además, eliminar el "{}" para comprobar, en segunda ruta

+0

brillante comentario - gracias Pankaj. Pero, ¿por qué necesito eliminar el {}? –

+2

Para asegurarse de que solo la URL basada en segmentos "Verificar" puede usar la ruta personalizada ... Si utiliza "{}", entonces la URL '/ Cuenta/AnyOtherValue/sachin13/409bdaaa-0b65-4bb8- 8695-6e430323d8f8' también dirigirá a la misma acción en lugar de mostrar el error 404. –

+0

gracias - aprobado por usted. –

Cuestiones relacionadas