2013-02-14 14 views
6

Mam pytanie routingu ASP.NET MVC. Po pierwsze pozwól mi wyjaśnić konfigurację moich obszarów. To całkiem proste.Jak zapobiec wielu odwzorowaniom tras ASP.NET MVC

Areas 
| 
+--Foo 
    | 
    +--Controllers 
     | 
     +--BarController.cs 

Mam folder w moich dziedzinach nazywany "Foo" oraz kontroler o nazwie "BarController.cs" Kontroler Bar posiada kilka metod nazwanych "DoStuff1()", "DoStuff2()", itd

Moja strona internetowa korzysta z następujących adresów:

/foo/bar/15 
/foo/bar/dostuff1 
/foo/bar/dostuff2 

pierwszy URL wymaga identyfikatora i korzysta z domyślnej metody Index() w kontrolerze pasek, aby wypełnić stronę z widokiem i modelu.

W drugim i trzecim adresie URL używam ich do wywoływania ajax jQuery.

Oto kod z mojej okolicy registrion

context.MapRoute(null, "Foo/Bar/DoStuff1", new 
{ 
    action = "DoStuff1", 
    controller = "Bar" 
}); 

context.MapRoute(null, "Foo/Bar/DoStuff2", new 
{ 
    action = "DoStuff2", 
    controller = "Bar" 
}); 

context.MapRoute(null, "Foo/Bar/{id}", new 
{ 
    action = "Index", 
    controller = "Bar" 
}); 

Moim problemem jest to, że dla każdej nowej metody kontrolera tworzę, muszę dodać kolejny odwzorowanie trasy w pliku registrion kierunkowym. Na przykład, jeśli dodać metodę DoStuff3(), to muszę dodać to do rejestracji Powierzchnia:

context.MapRoute(null, "Foo/Bar/DoStuff3", new 
{ 
    action = "DoStuff3", 
    controller = "Bar" 
}); 

Jak mogę stworzyć ogólne odwzorowanie trasy do obsługi adresów URL wspomniałem powyżej, które nie wymagać nowych dodatków do pliku rejestracji obszaru dla nowych metod kontrolera?

+0

Tego szukasz? http://stackoverflow.com/questions/2682170/asp-net-mvc-areas-how-to-hide-area-name-in-url –

Odpowiedz

3

Można wyciągnąć działanie kontrolera.

Wpisz adres URL tak:

"Foo/Bar/{action}" 

Dodatkowo można wyciągnąć regulator, jak również i napisać

"Foo/{controller}/{action}" 

w tym przypadku action = "Index" zapewnia domyślną wartość „Indeksu” jeśli nie podano parametru działania.

W tym przypadku musisz rozróżnić między "Foo/Bar/{action}" i "Foo/Bar/{id}". Ponieważ dopasowywanie odbywa się w kolejności, musisz najpierw ustawić trasę id i dodać parametr constraint do parametru id. Dzięki temu można dopasować prawidłowe identyfikatory numeryczne i nazwy akcji, aby przejść do następnej trasy. Twoje dwie trasy będzie wyglądać następująco:

context.MapRoute(null, "Foo/Bar/{id}", new 
{ 
    action = "Index", 
    controller = "Bar" 
}, 
new { id = @"\d+" }); 

context.MapRoute(null, "Foo/Bar/{action}", new 
{ 
    action = "Index", //optional default parameter, makes the route fall back to Index if no action is provided 
    controller = "Bar" 
}); 
+0

Właśnie znalazłem artykuł na temat dodawania ograniczenia liczbowego. Zobacz moją zaktualizowaną sekcję w pytaniu. – Halcyon

+0

Właściwie to wycofałem tę zmianę. Rozwiązanie/odpowiedź nie powinny być edytowane w quesiton. Pytanie powinno zawierać tylko pytanie. Odpowiedzi powinny być zamieszczone jako odpowiedzi (w mojej odpowiedzi już mam link do tego artykułu). – yoozer8

0

Domyślny routing, który pochodzi z szablonami MVC są dobre dla większości potrzebnych konfiguracji trasy.

routes.MapRoute(
        name: "Default", 
        url: "{controller}/{action}/{id}", 
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
      ); 
Powiązane problemy