Kiedy użyjesz atrybutu ChildActionOnly
? Co to jest ChildAction
i w jakich okolicznościach chcesz ograniczyć działanie za pomocą tego atrybutu?
źródło
Kiedy użyjesz atrybutu ChildActionOnly
? Co to jest ChildAction
i w jakich okolicznościach chcesz ograniczyć działanie za pomocą tego atrybutu?
ChildActionOnly
Atrybut zapewnia, że metoda działania można nazwać tylko jako sposób dziecko od wewnątrz widoku. Metoda akcji nie musi mieć tego atrybutu, aby była używana jako akcja podrzędna, ale zwykle używamy tego atrybutu, aby zapobiec wywoływaniu metod akcji w wyniku żądania użytkownika. Po zdefiniowaniu metody akcji musimy stworzyć to, co będzie renderowane, gdy akcja zostanie wywołana. Działania dzieci są zwykle związane z częściowymi poglądami, chociaż nie jest to obowiązkowe.
[ChildActionOnly] zezwalające na ograniczony dostęp za pomocą kodu w widoku
Implementacja informacji o stanie dla określonego adresu URL strony. Przykład: URL strony płatności (płacąc tylko raz) składnia maszynki do golenia umożliwia wywołanie określonych akcji jako warunkowe
// example from Music Store // GET: /ShoppingCart/CartSummary [ChildActionOnly] public ActionResult CartSummary() { // your stuff } /ShoppingCart/CartSummary will return "The action 'CartSummary' is accessible only by a child request."
Więc uniemożliwiasz GET bezpośrednio do określonego kontrolera, ale tylko z innego kontrolera / akcji. Prawdopodobnie: _ Częściowe wyświetlenia.InvalidOperationException
kiedy zaznaczona metoda<ChildActionOnly>
jest wywoływana przez przeglądarkę?W przypadku atrybutu [ChildActionOnly] z adnotacją metodę akcji można wywołać tylko jako metodę podrzędną z poziomu widoku. Oto przykład dla [ChildActionOnly]. .
istnieją dwie metody akcji: Index () i MyDateTime () oraz odpowiadające im widoki: Index.cshtml i MyDateTime.cshtml. to jest HomeController.cs
Oto widok pliku Index.cshtml .
Oto częściowy widok MyDateTime.cshtml .
Oznacza to, że nie możesz bezpośrednio wywołać częściowego widoku. ale można go wywołać za pomocą widoku Index (), tak jak w pliku Index.cshtml
źródło
NonAction
również, co to za różnica?Użyjesz go, jeśli używasz
RenderAction
w którymkolwiek ze swoich widoków, zwykle do renderowania widoku częściowego.Powodem oznaczenia tego
[ChildActionOnly]
jest to, że potrzebujesz metody kontrolera, aby była publiczna, więc możesz ją wywołać,RenderAction
ale nie chcesz, aby ktoś mógł przejść do adresu URL (np. / Controller / SomeChildAction) i zobaczyć wyniki tego działanie bezpośrednio.źródło
RenderAction
żadnegoNonActionAttribute
rzeczywistych projektów?private
lubprotected
. Naprawdę nie mogę wymyślić żadnego dobrego powodu, dla którego chciałbyś stworzyć metodę kontrolera,public
chyba że chciałbyś mieć możliwość wywołania jej bezpośrednio lub przezRenderAction
FYI, [ChildActionOnly] nie jest dostępne w ASP.NET MVC Core. zobacz więcej informacji tutaj
źródło
Trochę za późno na imprezę, ale ...
Pozostałe odpowiedzi dobrze wyjaśniają, jaki wpływ
[ChildActionOnly]
ma ten atrybut. Jednak w większości przykładów ciągle zadawałem sobie pytanie, dlaczego tworzyłem nową metodę akcji tylko po to, aby renderować częściowy widok w innym widoku, skoro można po prostu renderować@Html.Partial("_MyParialView")
bezpośrednio w widoku. Wydawało się, że jest to niepotrzebna warstwa. Jednak, gdy badałem, odkryłem, że jedną z korzyści jest to, że działanie dziecka może stworzyć inny model i przekazać go częściowemu poglądowi. Model potrzebny dla częściowej może nie być dostępny w modelu widoku, w którym renderowany jest widok częściowy. Zamiast modyfikować strukturę modelu, aby uzyskać potrzebne obiekty / właściwości tylko do renderowania częściowego widoku, możesz wywołać akcję potomną i zlecić metodzie akcji utworzenie modelu potrzebnego do widoku częściowego.Może się to przydać na przykład w
_Layout.cshtml
. Jeśli masz kilka właściwości wspólnych dla wszystkich stron, jednym ze sposobów osiągnięcia tego jest użycie modelu widoku bazowego i dziedziczenie z niego wszystkich innych modeli widoku. Następnie_Layout
może użyć modelu widoku bazowego i wspólnych właściwości. Wadą (która jest subiektywna) jest to, że wszystkie modele widoków muszą dziedziczyć z modelu widoku podstawowego, aby zagwarantować, że te wspólne właściwości są zawsze dostępne. Alternatywą jest renderowanie@Html.Action
w tych wspólnych miejscach. Metoda akcji stworzyłaby oddzielny model potrzebny dla częściowego widoku wspólnego dla wszystkich stron, co nie wpłynęłoby na model dla „głównego” widoku. W tym przypadku_Layout
strona nie musi mieć modelu. Wynika z tego, że wszystkie inne modele widoku nie muszą dziedziczyć z żadnego modelu widoku bazowego.Jestem pewien, że istnieją inne powody, dla których warto używać tego
[ChildActionOnly]
atrybutu, ale wydaje mi się, że jest to dobry, więc pomyślałem, że się nim podzielę.źródło
źródło