2012-01-18 10 views
7

Ho un controller chiamato account con un azione con la seguente firma:Errore MVC Percorso: La voce 'Lunghezza' vincolo

public ActionResult Verify(string userName, Guid authorisationToken); 

ho creato un link per chiamare questa azione così:

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

Quando vado a questo link ricevo il seguente errore:

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. 

questo è ciò che il mio metodo RegisterRoutes sembra li ke in 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" 
      ); 
     } 

Due domande:

  1. sto facendo nulla di straordinario o è la mia metodologia di qui in linea con la prassi consolidata?

  2. Qual è il problema qui?

Grazie,

Sachin

risposta

12

si dovrebbe cambiare

"UI.Controllers"

a

new[] { "UI.Controllers" }

nella seconda via.

Se si specifica una sola stringa (non un array) allora si ottiene un sovraccarico sbagliato di MapRoute funzione - invece di MapRoute(RouteCollection, String, String, Object, String[]) che accettano un elenco di spazi dei nomi come ultimo parametro si ottiene MapRoute(RouteCollection, String, String, Object, Object) che prevede vincoli come ultimo parametro. String "UI.Controllers" non è una specifica di vincolo corretta => si ottiene l'errore.

Anche come @Pankaj suggerito il percorso personalizzato dovrebbe andare prima del valore predefinito e Verify dovrebbe essere senza "{}".

codice 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, signore - è stato brillante - ha funzionato. Devo che tu sia birra. –

2

dichiarare sempre il proprio itinerario personalizzato prima che il percorso predefinito in modo da farlo funzionare mentre lavorano in ordine dal primo all'ultimo. Pertanto è necessario dichiarare il secondo percorso prima del percorso predefinito e dovrebbe risolvere il problema, suppongo. Inoltre, rimuovere il "{}" per Verifica in seconda via

+0

brillante commento - grazie Pankaj. Ma perché devo rimuovere il {}? –

+2

Per assicurarsi che solo l'URL basato sul segmento "Verifica" sia autorizzato a utilizzare il percorso personalizzato .... Se si utilizza "{}", quindi l'URL '/ Account/AnyOtherValue/sachin13/409bdaaa-0b65-4bb8- 8695-6e430323d8f8' indirizzerà anche alla stessa azione anziché mostrare l'errore 404. –

+0

grazie - pollice in alto a voi. –

Problemi correlati