2012-03-04 18 views
8

Mam klienta, który chce wykorzystać konwencję URL nazewnictwa wzdłuż linii:ASP.Net MVC ze złożonymi trasami - jak zachować "zdrowy rozsądek"?

/{subjectarea}/{subject}/{action} 

Który jest w porządku - to działa doskonale, z jednego kontrolera na obszarze tematycznym, posiadające działanie po identyfikatorze (w zależności) nie stanowi problemu.

Jednak wtedy komplikuje, gdy klient potem chce dalej kontynuować hierarchię:

/{subjectarea}/{subject}/{action}/{tightlyrelatedsubject}/{tightlyrelatedsubjectvariables}/{tightlyrelatedsubjectaction} 

Mam kontroler dla ściśle powiązanego podmiotu (jego tylko kolejny obszar tematyczny), który obsługuje wszystkie po stronie administratora, ale klient nalega, aby widok publiczny był zawieszony na obiekcie nadrzędnym, a nie na własnym katalogu głównym.

W jaki sposób mogę to zrobić, unikając łamania całych zleceniodawców MVC, a także unikając ponownego wdrożenia tony ASP.Net MVC zapewniał funkcjonalność w moim kontrolerze obszaru tematycznego tylko po to, aby móc obsłużyć powiązane tematy z tego samego kontroler?

Czy można w jakiś sposób wywołać kontroler powiązanych tematów z kontrolera nadrzędnego podmiotu i zwrócić wynikowy widok (ponieważ zachowałoby to oddzielenie funkcjonalności podmiotów do ich własnych kontrolerów)? Jeśli to możliwe, rozwiąże to problem z wieloma problemami.

Odpowiedz

2

Oto rozwiązanie, które rozwiązuje mój konkretny problem - mam nadzieję, że rozwiąże on kogoś innego.

Jak wspomniano w moim komentarzu do Roberta Harveya, wszystko, czego potrzebuję, to inna trasa, która nie używa pierwszych dwóch lub trzech komponentów jako kontrolera, akcji i id, ale zamiast tego przyjmuje te wartości od później - jeśli powiesić to na wartości statycznej również na trasie, znacznie łatwiej zrobić.

Więc tutaj jest url Zdecydowałem się na uproszczenie trasy:

/{subjectarea}/{subject}/related/{tightlyrelatedsubject}/{tightlyrelatedsubjectvariables}/{tightlyrelatedsubjectaction} 

Trasa, która spełnia ten adres jest następujący:

 routes.MapRoute(
      "RelatedSubjects", 
      "{parentcontroller}/{parentsubject}/related/{controller}/{id}/{action}", 
      new { controller = "shoes", action = "view", id = "all" } 
     ); 

na późniejsze działania kontrolera, mogę zapytaj o wartości parametrów dla parentcontroller i parentubject, dzięki czemu mogę odfiltrować powiązany element, aby był specyficzny dla danego rodzica - problem rozwiązany!

Ta trasa musi być powyżej tych, które zajmują się tylko dwiema pierwszymi wartościami, w przeciwnym razie grozi ci przejęcie kontroli nad inną mapą trasy.

Mogłem to zrobić całkowicie bez/powiązanej/statycznej części, ponieważ trasa mogłaby łatwo dopasować się do liczby samych wartości, i rzeczywiście mogę to zrobić - jednak uważam, że lepiej jest dla późniejszej administracji, jeśli jest statyczna element tam, aby potwierdzić korzystanie z trasy.

Mam nadzieję, że to pomoże komuś!

+0

To jest dokładnie to samo co ja, używając nowego kontrolera widoku, ale zachowując dostęp do kontrolera nadrzędnego i parametrów nadrzędnych. Dziękujemy za przesłanie wyników. –

1

Jednym ze sposobów można to zrobić, to określić trasy wieloznaczny (zawiadomienie gwiazdka):

routes.MapRoute("subjects", "{action}/{*path}", 
    new { controller = "Subjects", action = "Index" }); 

Pozwala to kontroler, aby otrzymać cały ciąg ścieżki po action.

Można wówczas uzyskać hierarchię przedmiotów w metodzie kontrolera tak:

string[] subjects = path.Split('/'); 

Kiedy już, że można robić wszystko co chcesz, w tym wysyłania różnych przedmiotów do różnych metod obsługi dla przetwórstwa.

+0

To jest tak, jak rozważałem przed wysłaniem pytania - jednak ma to skutek uboczny wyrzucenia większości tego, co zapewnia mi ASP.Net MVC w tym, że jest dużo "routingu", który musiałbym wtedy zrobić ręcznie w ramach metody kontrolera obsługującej akcję - tego właśnie próbowałem uniknąć. Gdybym mógł wybrać wartość kontrolera, działanie i identyfikator powiązanej jednostki, mogę wszystko zostawić kontrolerowi docelowemu, zamiast konieczności ponownego wdrażania wszystkiego na bieżącym kontrolerze (co również naruszałoby zasadę jednej odpowiedzialności). Czy to ma sens? – Moo

+0

Warto zwrócić uwagę, że problem polega nie na tym, jak uzyskać wartości z trasy, jak uzyskać wynikowy widok z właściwego kontrolera, podczas gdy w ramach innego kontrolera - gdyby było to możliwe ... i podążaj w myślach, jak coś mi się przydarza. Jedyne, czego naprawdę potrzebuję, to inne stati, w których pierwsze trzy wartości * nie * są uważane za kontroler, działanie lub id, ale po prostu więcej danych i wartości actaul dla kontrolera, działania i id są pobierane z dalszej trasy ... hmmm – Moo

Powiązane problemy