2010-04-21 24 views
13

Po uruchomieniu MVC 2 Areas example że ma obszar blog i blog Controller URL wygląda następująco:Obszary ASP.NET MVC: jak ukryć nazwę obszaru w adresie URL?

http://localhost:50526/Blog/Blog/ShowRecent w formacie:

RootUrl/AreaName/ControllerName/ActionName

Po prostu odkrytych obszarów MVC wydaje się świetnym sposobem na uporządkowanie kodu, tzn. utworzenie Obszaru dla każdej sekcji, która w moim przypadku ma własny kontroler. Oznacza to, że każda nazwa obszaru = ControllerName. Efektem tego jest podwójna ścieżka AreaName/ControllerName w adresie URL, np /Blog/Blog/ powyżej

Nie mając pełną zrozumienie routingu, jak mogłem routing ustawiony tak, aby nie pokazać AreaName?

EDIT:

Próbuję zmniejszyć ilość pracy przy trasach jak te wydają się wpływać siebie (tzn wymagają szczególnego uporządkowania) i może spowodować poważne bóle głowy :-) W przekształcenie istniejącej aplikacji formularza internetowego do MVC, przekonwertowałem kilka podstawowych sekcji, mają one jeden kontroler każdy i sporą ilość widoków/akcji i chociaż większość dostępu do danych jest kodowana w złożeniach, liczba klas Model/ViewData rośnie ... Obecnie tworzę podfoldery w folderach Modele główne/Widoki dla tych sekcji (lub Obszarów) i miałem nadzieję, że tworzenie Obszarów będzie działało w ten sam sposób, z wyjątkiem tego, że jest zorganizowany kod (przy użyciu podstawowej trasy pokrywającej Obszar) Każdy komentarz w tej sprawie?

+1

Z ciekawości, jeśli nie chcesz, aby dodatkowy folder, dlaczego wdrożyć aplikację w ten sposób? – GalacticCowboy

+1

Btw .. Nie przesadzaj z trasami .. Jeśli tworzysz obszar, który będzie miał jeden kontroler, to czy na pewno potrzebuje oddzielnego obszaru? :) –

+0

@GalacticCowboy, Artiom: Dobre punkty i dodaliśmy więcej komentarzy powyżej ... Może wyglądać na Obszary mogą nie być do zrobienia, a nawet coś do rozpoczęcia, gdy musimy rozpocząć organizowanie większych/konkretnych sekcji. –

Odpowiedz

18

Wewnątrz folderu każdego obszaru zobaczysz plik *AreaName*AreaRegistration.cs. Tutaj przechowywane są reguły trasowania obszaru. Domyślnie, gdy są generowane, będą zawierały nazwę obszaru przed wszystkim innym. Problem polega na tym, że jeśli usuniesz nazwę obszaru "folder" z trasy, trasa będzie przechwytywać wszystkie "standardowe" {kontroler}/{ action}/{id} requests. Co oczywiście nie jest tym, czego potrzebujesz ..

Aby to rozwiązać, możesz dodać filtry regex na trasach, w oparciu o nazwy kontrolerów obecne na tej trasie. Wada? Nie będziesz mieć dwóch kontrolerów o tej samej nazwie w aplikacji (przynajmniej nie używając standardowej trasy.) Zawsze możesz wymyślić inną trasę dostępu do nich :))

W końcu .. posiadające tę strukturę:

/Obszary
/Areas/Blog/Controllers/BlogController.cs
/Areas/Blog/Controllers/FeedController.cs
/Areas/User/Controllers/UserController.cs
/Controllers/PageController.cs

Co trzeba mieć to czegoś takiego: W BlogAreaRegistration.cs:

context.MapRoute(
    "Blog_default", 
    "{controller}/{action}/{id}", 
    new { action = "Index", id = UrlParameter.Optional }, 
    new { controller = "(Blog|Feed)" } 
); 

W UserAreaRegistration.cs:

context.MapRoute(
    "User_default", 
    "{controller}/{action}/{id}", 
    new { action = "Index", id = UrlParameter.Optional }, 
    new { controller = "(User)" } 
); 

W Global.asax.cs:

public static void RegisterRoutes(RouteCollection routes) 
{ 
    context.MapRoute(
    "Default", 
    "{controller}/{action}/{id}", 
    new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
    ); 
} 
protected void Application_Start() 
{ 
    AreaRegistration.RegisterAllAreas(); 

    RegisterRoutes(RouteTable.Routes); 
} 

Pamiętaj, że w rejestracjach global.asax są najważniejsze! :)

UPD: podstawie aktualizacją pytanie: Jest nam jeden z głównych rzeczy, które musisz wziąć pod uwagę, jeśli będziesz korzystać obszary: Jeśli masz link inter-kierunkowy, będziesz również musi podać nazwę obszaru w linku. Na przykład.

<%: Html.ActionLink("Link text", "Action", "Controller", new { area = "Blog", id = 4, title = "page-title" }); %> 

Masz pomysł.

W odniesieniu do wielu modeli/widoków, w tej chwili jestem następujących konstrukcji jak ta

/Kod/// pomocnik, zajęcia rozszerzające, które nie zostały przeniesione do biblioteki
/Modele/Dane/// klasach EF + ćwiczenia walidacji tutaj
/Modelki/ViewModels/{kontroler}/// zobacz modele przechowywane na kontrolerze

tej pory działa dobrze, i udało mi się utrzymać rozwiązanie stosunkowo zorganizowanej . Jak już wspomniano, tylko obszar, który stworzyłem do tej pory jest to obszar Admin bo to że znacznie różni się od reszty strony :)

+0

Dzięki za to! Będę potrzebował grać z tym (i dobrze się zastanowić), aby zobaczyć, jakie korzyści można uzyskać za pomocą Obszarów w obecnej sytuacji ... –

+1

Po to, by podać ci moją obecną sytuację: Pracuję nad moim własnym blogiem (prawdopodobnie niepubliczne, napisane tylko dla siebie). W tej chwili większość kontrolerów znajduje się w domyślnym folderze Controllers. Strony, rejestracja/uwierzytelnianie, komentarze, pobieranie plików itp. Ale utworzyłem obszar administracyjny, ponieważ myślę, że powinien on być oddzielony od zwykłego kodu + ma inny wygląd (osobny folder Contect itp.). Ostatecznie to zależy od ciebie) –

+0

Dodano aktualizację odpowiedzi, odpowiadając na aktualizację pytania. Umm .. zabrzmiało to dziwnie: D –

1

Wystarczy odpowiedzieć na oryginalne pytanie, na wypadek, gdyby ktoś czyta to:

Nie nadawaj swojego [domyślnego] bloga kontrolera. Właśnie dlatego dostajesz bloga/bloga {area/controller}. Możesz nadać mu zupełnie inną nazwę: np. Blog/widok, blog/posty, blog/aktualny itp. Lub domyślnie taki jak dom. w tym przypadku, jeśli masz w swoim domu także out-of-kontrolerów obszarze, będziemy chcieli domyślnej przestrzeni nazw Kontroler:

routes.MapRoute("Default", 
    "{controller}/{action}/{id}", 
    new { controller = "Home", action = "Index", id = UrlParameter.Optional}, 
    new[] { *appname*.Controllers" }); 

To zapewni, że „/” i „/ blog” przejść do odpowiedni kontroler "domowy". Jeśli szukasz duplikatu błędu kontrolera domowego, znajdziesz więcej informacji na ten temat.

Powiązane problemy