2010-10-21 13 views
5

Próbujemy użyć niestandardowych tras w aplikacji ASP.NET MVC do wygenerowania tego adresu URL: 'http://example.com/Person/unnecessaryinfo-42'. "Unnecessaryinfo" to nazwa identyfikatora, która spowoduje, że adres URL będzie hakowany dla użytkownika. Poniżej znajduje się kod naszej mapy tras. To działa, ale moja akcja kontrolera kończy się na "niepotrzebneinfo-42" w parametrze id. Czy mogę usunąć "niepotrzebne info-" zanim osiągnie działanie kontrolera?Jak usunąć niepotrzebne informacje z przyjaznego dla użytkownika adresu URL, zanim dojdzie do działania kontrolera?

routes.MapRoute("person_id", "person/{id}", 
    new { controller = "Customer", action = "Details" }, 
    new { id = @"unnecessaryinfo-\d" }); 

Edit:

Oto nasz najnowszy kod:

routes.MapRoute("person_id", "person/{unnecessaryinfo}-{id}", 
    new { controller = "Customer", action = "Details" }, 
    new { id = @"[\d]{1,6}" }); 

W rozdziale Routing z ASP.NET MVC 2 In Action (strona 234) omawia unikanie stosowania identyfikatorów baz danych w miarę możliwości, ale jeśli trzeba z nich korzystać , dodając dodatkowe informacje, aby odczytać URL. Właśnie tego próbujemy (bezskutecznie). Identyfikator bazy danych waha się obecnie od 1 do 6 cyfr (i może rosnąć wraz z upływem czasu).

Odpowiedz

5

Twój iz powrotem na Darin's answer sprawia mi wierzyć, że prawdopodobnie masz inną trasę, która jest dopasowana i używany zamiast tego szlaku:

routes.MapRoute("person_id", "person/{unnecessaryinfo}-{id}", 
    new { controller = "Customer", action = "Details" }, 
    new { id = @"[\d]{1,6}" }); 

Switching kolejność trasy są dodawane do RouteCollection powinien naprawić problem. Bardziej szczegółowe trasy powinny być pierwszymi dodanymi do kolekcji. Na przykład, jeśli masz również tę trasę:

routes.MapRoute("person_login", "person/{id}", 
    new { controller = "Customer", action = "Details" }); 

Powinno pojawić Po bardziej szczegółowe „person_id” trasę tak Twój kod będzie wyglądać następująco:

routes.MapRoute("person_id", "person/{unnecessaryinfo}-{id}", 
    new { controller = "Customer", action = "Details" }, 
    new { id = @"[\d]{1,6}" }); 

routes.MapRoute("person_login", "person/{id}", 
    new { controller = "Customer", action = "Details" }); 

URL swojej warunkiem 'http://example.com/Person/unnecessaryinfo-42' będzie pasował do obie trasy, ale ponieważ twoja bardziej konkretna trasa pojawia się jako pierwsza, jest to trasa, która będzie używana. Kiedy mniej konkretny adres URL jest mapowany, nie będzie pasował do pierwszego i dlatego będzie używana druga trasa.

To, że ustalenie, jakie trasy dopasowuje URL, może być nieco trudne. Na szczęście, istnieją dwa bardzo dobre opcje, które pomagają z debugowania trasy:

rozwiązania Szczepana jest prawdopodobnie najlepszy dla długotrwale używać, ale Phil's jest zdecydowanie łatwiejsze do wdrożenia w dół i brudne debugowanie. Zacznę od zmiany kolejności tras, ale jeśli to nie rozwiąże problemu, użyj jednego z wyżej wymienionych debugerów.

3
routes.MapRoute(
    "person_id", 
    "person/{unnecessaryinfo}-{id}", 
    new { controller = "Customer", action = "Details" }, 
    new { id = @"\d" } 
); 

Można też dodać trochę regex ograniczenie w tokena unnecessaryinfo trasy.

+0

Próbowałem dokładnie to, co masz powyżej i nadal daje mi "niepotrzebne info-id" w kontroler. Nie rozumiem także, co masz na myśli, mówiąc: "Możesz również dodać ograniczenie regex do niepotrzebnego tokena trasy". – rkgallegos

+0

Jakiego adresu używasz? '~/customer/details/foobarunotrzebessary-5' i' public ActionResult Details (string id) 'dadzą ci' id = 5' w akcji kontrolera.Zauważ też, że '\ d' oznacza ** pojedynczą cyfrę **. Jeśli użyjesz '~/customer/details/foobarunnecessary-123' i nadal będziesz mieć domyślną trasę na końcu (' {controller}/{action}/{id} '), to ta domyślna trasa będzie pasować, a nie Twoja niestandardowa trasa a otrzymasz 'id = foobarunnecessary-123' w akcji kontrolera. –

+0

Końcowy adres URL, do którego próbujemy się dostać, to ~/Person/unnecessaryinfo-42, a liczba cyfr będzie się różnić i może wynosić od 1 do 6 lub więcej. – rkgallegos