W naszej aplikacji internetowej muszę zapisać kolejność pobieranych i wyświetlanych elementów w zależności od widoku - a dokładniej - kontrolera i akcji, która wygenerowała widok (i oczywiście identyfikator użytkownika, ale nie o to tutaj chodzi).
Zamiast po prostu podawać identyfikator w każdej akcji kontrolera (aby użyć go do sortowania danych wyjściowych DB zależnych od widoku), pomyślałem, że bezpieczniej i łatwiej byłoby utworzyć ten identyfikator automatycznie na podstawie kontrolera i metody akcji, którą otrzymuje dzwonił z.
Jak mogę uzyskać nazwę kontrolera i akcję z metody akcji w kontrolerze? A może potrzebuję do tego refleksji? Myślę, że to całkiem proste, z góry dzięki!
c#
asp.net-mvc
controller
action
Alex
źródło
źródło
Route
atrybutu w metodzie akcji, którą zbieram? Czy jest również możliwa zmiana nazw kontrolerów?Odpowiedzi:
źródło
Oto kilka metod rozszerzających służących do uzyskiwania tych informacji (obejmuje również identyfikator):
Stosowanie:
źródło
Może się przydać. Potrzebowałem akcji w konstruktorze kontrolera i pojawia się ona w tym momencie cyklu życia MVC,
this
nie została zainicjowana iControllerContext = null
. Zamiast zagłębiać się w cykl życia MVC i znaleźć odpowiednią nazwę funkcji do zastąpienia, po prostu znalazłem akcję wRequestContext.RouteData
.Ale aby to zrobić, tak jak w przypadku innych
HttpContext
powiązanych zastosowań w konstruktorze, musisz określić pełną przestrzeń nazw, ponieważthis.HttpContext
również nie została zainicjowana. Na szczęście wydaje się, żeSystem.Web.HttpContext.Current
jest statyczny.UWAGA: prawdopodobnie nie jest to najbardziej obsługiwany sposób uzyskiwania dostępu do wszystkich właściwości w HttpContext, ale w przypadku RequestContext i Session wydaje się, że działa dobrze w mojej aplikacji.
źródło
źródło
źródło
Oto, co mam do tej pory:
źródło
Oto najprostsza i najbardziej praktyczna odpowiedź na pytanie:
Lub
Kod powyżej testów z asp.net mvc 5.
źródło
Dodaj to do kontrolera podstawowego w metodzie GetDefaults ()
Zaimplementuj kontrolery do Basecontroller
Dodaj częściowy widok _Breadcrumb.cshtml i dodaj go na wszystkich wymaganych stronach z @ Html.Partial ("_ Breadcrumb")
_Breadcrumb.cshtml
źródło
filterContext
zmienną od wewnątrzGetDefaults()
?Możesz uzyskać nazwę kontrolera lub nazwę akcji z akcji, jak każda zmienna. Są po prostu specjalne (kontroler i akcja) i już zdefiniowane, więc nie musisz robić nic specjalnego, aby je zdobyć, z wyjątkiem mówienia, że ich potrzebujesz.
Lub możesz dołączyć kontroler, akcję do swoich modeli, aby uzyskać dwa z nich i własne dane.
źródło
Wydaje mi się, że działa to dobrze (na razie), działa również, jeśli używasz routingu atrybutów.
źródło
Aby usunąć potrzebę
ToString()
korzystania z połączeńźródło
string actionName = this.ControllerContext.RouteData.Values ["action"]. ToString ();
string controllerName = this.ControllerContext.RouteData.Values ["controller"]. ToString ();
źródło
Dlaczego nie mieć czegoś prostszego?
Po prostu zadzwoń
Request.Path
, zwróci ciąg oddzielony znakiem „/”a następnie możesz użyć,
.Split('/')[1]
aby uzyskać nazwę kontrolera.źródło
http://www.example.com/sites/site1/controllerA/actionB/
.:). MVC zapewnia kilka interfejsów API do routingu, więc dlaczego musisz analizować (ponownie) adresy URL ?.controller/action