2011-01-16 9 views
1

Ich bin neu bei .net mvc. Kurz gesagt, ich möchte meine Website sehen, so dass Leute tippen können: mywebsite/John @ Eric und durch den richtigen Controller verarbeitet werden.asp.net mvc routing und das mysteriöse 404

Auf der anderen Seite, würde Ich mag auch direkte Aktionen wie in der Lage sein zu spezifizieren: mywebsite/GetPeople

und erhält proccessed von GetPeople Aktion.

ich zwei Routing-Regeln eingerichtet haben in meiner Anwendung:

erste Route

routes.MapRoute("Default", 
        "{id}", 
      new { controller = "Friends", action = "Index", id = UrlParameter.Optional }, 
      new { controller = @"[^\.]*", id = @"(?i)[a-z]*@[a-z]*" } 
     ); 

zweite Route

routes.MapRoute(
     "Friends", 
     "{action}/{id}", 
     new { controller = "Friends" } 
     ); 

Die erste und die Standardroute funktioniert gut, aber dann, wenn ich eine Anfrage wie folgt sende: mywebsite/GetPeople Die Cheacky-Index-Aktion übernimmt und liest GetPeople als wäre es ein Parameter. Obwohl ich meinen wirklich tollen Regax hinzugefügt habe, scheint das nicht zu funktionieren.

Irgendwelche Ideen?

Antwort

1

Hier ist, wie Sie Ihre Routen aussehen könnte:

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

    routes.MapRoute(
     "Friends", 
     "{id}", 
     new { controller = "Friends", action = "Index", id = UrlParameter.Optional }, 
     new { id = @"(?i)[a-z]*@[a-z]*" } 
    ); 

    routes.MapRoute(
     "Default", 
     "{action}/{id}", 
     new { controller = "Friends", action = "Index", id = UrlParameter.Optional } 
    ); 
} 

Jetzt wird mywebsite/[email protected] durch die Index Wirkung des Friends Controller gehandhabt werden und mywebsite/GetPeople wird durch die GetFriends Wirkung des Friends Controller gehandhabt werden .

+0

@Darin, das ist großartig. Aber was ist, wenn beide Routen von demselben Controller verwaltet werden - in diesem Fall "Friends". Das ist mein Fall, und es scheint eine Korrektur zu geben. – vondip

+0

@vondip, versuchen Sie dann, 'controller =" Friends "' in der 'Default' Route anzugeben. Ich war verwirrt von deiner Frage, wo du über 'GetPeople'-Controller gesprochen hast, während du eigentlich die' GetPeople'-Aktion auf dem 'Friends'-Controller haben möchtest. –

+0

@Darin, habe meine Verwechslung behoben und die Aktion als Controller benannt. Ok, ich habe es versucht, aber für meine Bestürzung scheint es nicht zu funktionieren. Nur zur Erinnerung daran, dass beide Routen demselben Controller zugeordnet sind. Es macht mich verrückt. – vondip

0

Das ist wegen der Art, wie Routing in MVC funktioniert. Es stimmt nur eingehende URLs mit Routen in der Reihenfolge ab, in der die Routen in RegisterRoutes deklariert sind. In diesem Fall würde der GetPeople in der URL mit dem Id-Parameter übereinstimmen, da alles optional ist. Um dies zu beheben, würde ich einen Standard als letzte Route hinzufügen. Es könnte so gemacht werden

routes.MapRoute("", "{controller}/{action}", new { controller = "Friends",action="Index" }); 

Dies würde die GetMyPeople-URL behandeln. Sie müssten jedoch eine Index-Aktion haben. Der MvcContrib hat einen ausgezeichneten Test-Helfer, um MVC-Routen zu testen, bevor er von der App ausgeführt wird. Sie können die Bits here

+0

Dies scheint immer noch die Anfrage an den gleichen Standard-Handler mit der Aktion als Parameter zu senden. – vondip

+0

aah! Ich dachte, Sie hätten einen Controller namens GetPeople basierend auf Ihrer ursprünglichen Frage, aber es scheint, Sie hatten eine Aktion namens GetPeople – Hakeem

+0

Wenn das der Fall gewesen wäre, hätte die Lösung, die ich vorgeschlagen hatte, funktioniert haben. – Hakeem