2012-01-18 21 views
7

Mam kontroler o nazwie Konto z akcją z następującym podpisem:Błąd MVC trasy: Ograniczenie wjazdu „Długość”

public ActionResult Verify(string userName, Guid authorisationToken); 

Stworzyłem link wywołać tę akcję w następujący sposób:

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

Kiedy idę do tego linku pojawia się następujący błąd:

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. 

to właśnie moja metoda RegisterRoutes wygląda li ke w 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" 
      ); 
     } 

dwa pytania:

  1. robię nic niezwykłego czy moja metodologia tutaj zgodnie ze standardową praktyką?

  2. Na czym polega problem?

Dzięki

Sachin

Odpowiedz

12

należy zmienić

"UI.Controllers"

do

new[] { "UI.Controllers" }

w swojej drugiej trasie.

Jeśli podając tylko jeden ciąg (nie tablicy) następnie dostać złego przeciążenie MapRoute funkcji - zamiast MapRoute(RouteCollection, String, String, Object, String[]) który akceptuje listę nazw jako ostatni parametr można dostać MapRoute(RouteCollection, String, String, Object, Object) który oczekuje ograniczenia ostatnio parametru. Łańcuch "UI.Controllers" nie jest poprawną specyfikacją ograniczenia => pojawia się błąd.

Również jako @Pankaj zasugerował, że twoja niestandardowa trasa powinna iść przed domyślną i Zweryfikuj powinna być bez "{}".

Pełny kod:

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

Siergiej, proszę pana - to było genialne - zadziałało. Jestem ci winien piwo. –

2

Zawsze zadeklarować swój własny trasę przed domyślną trasę tak, aby to działało jak one działają w kolejności od pierwszego do ostatniego. Dlatego musisz zadeklarować swoją drugą trasę przed domyślną trasą, która powinna rozwiązać problem, jak sądzę. Również usunąć "{}" dla Zweryfikuj w drugiej drogi

+0

błyskotliwy komentarz - dzięki Pankaj. Ale dlaczego muszę usunąć {}? –

+2

Aby upewnić się, że tylko "Weryfikuj" adres URL oparty na segmencie może korzystać z niestandardowej trasy ... Jeśli używasz "{}", to URL '/ Account/AnyOtherValue/sachin13/409bdaaa-0b65-4bb8- 8695-6e430323d8f8' będzie również kierował do tej samej akcji, zamiast pokazywać błąd 404. –

+0

dzięki - kciuk do ciebie. –

Powiązane problemy