2010-12-14 23 views
9

Stworzyłem Trasy więc mogę zintegrować mojej aplikacji MVC z kilku WebForms stron, które istnieją w moim projekcie:MVC MapPageRoute i actionlink

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

    // register the report routes 
    routes.MapPageRoute("ReportTest", 
     "reports/test", 
     "~/WebForms/Test.aspx" 
    ); 

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

to stworzyło problem, kiedy mogę używać Html.ActionLink w Moje poglądy:

<%: Html.ActionLink("Home", "Index", "Home") %> 

Kiedy załadować stronę w przeglądarce link wygląda jak:

http://localhost:12345/reports/test?action=Index&controller=Home 

Czy ktoś już kiedyś to robił? Jak mogę to naprawić?

Odpowiedz

5

Zgaduję, że musisz dodać niektóre opcje parametrów do deklaracji MapPageRoute. Więc jeśli masz więcej niż jedną stronę z szablonami w katalogu WebForms, to działa dobrze.

routes.MapPageRoute ("ReportTest", 
         "reports/{pagename}", 
         "~/WebForms/{pagename}.aspx"); 

PS: Możesz także chcą spojrzeć na własność RouteCollection

RouteExistingFiles Alternatywą byłoby użyć

<%=Html.RouteLink("Home","Default", new {controller = "Home", action = "Index"})%> 
+2

Dzięki. Chciałem uniknąć używania RouteLink tylko dla zwięzłości, ale być może będę musiał go użyć. Po prostu nie rozumiem, dlaczego trasa strony jest dopasowywana do moich regularnych tras, kiedy używam ActionLink. – Dismissile

5

Właśnie miał bardzo podobny problem. Moim rozwiązaniem było nadanie systemowi routingu powodu do odrzucenia trasy strony podczas wyszukiwania dopasowań do ActionLinka.

W wygenerowanym adresie URL można zobaczyć, że ActionLink tworzy dwa parametry: kontroler i działanie. Możemy ich użyć, aby nasze "standardowe" trasy (~/kontroler/akcja/identyfikator) nie pasowały do ​​trasy strony.

Po zastąpieniu statycznych "raportów" w trasie strony parametrem, który nazwiemy "kontrolerem", a następnie dodaniem ograniczenia, że ​​"kontroler" musi być "raportowany", otrzymujemy tę samą trasę do naszych raportów, ale odrzuć wszystko za pomocą parametru kontrolera, który nie jest "raportowany".

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

    // register the report routes 
    // the second RouteValueDictionary sets the constraint that {controller} = "reports" 
    routes.MapPageRoute("ReportTest", 
     "{controller}/test", 
     "~/WebForms/test.aspx", 
     false, 
     new RouteValueDictionary(), 
     new RouteValueDictionary { { "controller", "reports"} }); 

    routes.MapRoute(
     "Default", // Route name 
     "{controller}/{action}/{id}", // URL with parameters 
     new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
    ); 
} 
Powiązane problemy