Widziałem wspaniałą odpowiedź na similar question, która wyjaśnia, dziedzicząc wszystkie kontrolery z nowej klasy bazowej ozdobionej własnym atrybutem ActionFilter, w jaki sposób można zastosować pewną logikę do żądań wszystkich do swojej witryny.Zastosuj filtr działania do każdego kontrolera tylko w jednej części witryny ASP.NET MVC?
Chciałbym znaleźć sposób na zrobienie tego w oparciu o obszar strony, którą odwiedza mój użytkownik.
Na przykład, Mam kontroler produkt pod kątem działania, ale chcę pozwolić, aby być wykorzystane do dwóch następujących adresów URL:
/produktu/Widok/321 - wyświetlacz ID produktu 321 do „normalnego 'users /Admin/Product/View/321 - używaj tego samego kontrolera View, ale wypluj dodatkowe funkcje dla moich administratorów.
Mogę przekazać "admin" jako parametr o nazwie "użytkownik" do mojej akcji widoku na moim kontrolerze produktu, aby wyświetlić dodatkowe informacje dla administratorów, metoda ta jest pokazana here. Ale wtedy musiałbym potwierdzić, że mój użytkownik mógł zobaczyć ten adres URL. Nie chcę ozdobić kontrolera produktu akcją ActionAttribute, która sprawdza uwierzytelnianie, ponieważ gdy nieuwierzytelnieni użytkownicy (i zalogowani administratorzy) przeglądają go w produkcie/Product/View/321, chcę, aby wszyscy zobaczyli widok standardowy.
Więc co ja jak do zrobienia, jest opisany poniżej w pseudo-kod:
Kiedy url w formacie „{userlevel}/{kontroler}/{działania}/{id} "Nazywa się, chciałbym zadzwonić do innego kontrolera, który wykonuje sprawdzanie autentyczności, a następnie" łańcuch "do pierwotnego {kontrolera} i przejść przez właściwości {akcja}, {id} i {userlevel}.
Jak to zrobić?
(Wiem, że przelot w celu sprawdzenia każdego połączenia z kontrolerem jest prawdopodobnie minimalny Chcę to zrobić w ten sposób, ponieważ może potrzebować później pewnych droższych rzeczy oprócz uwierzytelnienia użytkownika kontrole i wolałbym tylko kiedykolwiek uruchomić ten kod na niskim natężeniu ruchu administratora obszary mojej stronie. wydaje ma sensu robić te dla każdego użytkownika publicznym miejscu)
Bardzo dobrze zasłużony. Wiem, że byłem raczej konkretny w moim pytaniu, ale jestem zadowolony z tej odpowiedzi, wydaje się to być dobrym rozwiązaniem. Dzięki, Alconja! –
Pozdrowienia, Neil, Odpowiadałem na to w zasadzie w ten sam sposób, używając kontrolera bazowego i nadpisując OnActionExecuting, ale z większą ilością szczegółów i niezmiennością przypadku itp. Dzień przed Alconją. –
@Mike - Zgaduję, że rozumowanie było takie, że w momencie opublikowania mojego rozwiązania nie miałeś trochę kodu MapRoute, więc twoje rozwiązanie nie miało większego sensu ... i Neil prawdopodobnie nie widział twojej dzień później. Ponadto, jak już masz, nie możesz już przejść bezpośrednio do/Product/View/321 (który był jednym z wymagań podanych w pytaniu), ponieważ zinterpretuje to {rola = "Produkt", kontroler = "Widok" , action = "321", id = ""} & fail. – Alconja