Kiedy należy użyć atrybutu ChildActionOnly
? Co to jest ChildAction
iw jakiej sytuacji chciałbyś ograniczyć działanie za pomocą tego atrybutu?Używanie ChildActionOnly w MVC
Odpowiedz
Atrybut ChildActionOnly
zapewnia, że metoda akcji może być wywoływana tylko jako metoda potomna z poziomu widoku. Metoda działania nie musi mieć tego atrybutu do użycia jako akcji podrzędnej, ale zwykle używamy tego atrybutu, aby uniemożliwić wywołanie metod działania w wyniku żądania użytkownika. Po zdefiniowaniu metody działania, musimy utworzyć to, co zostanie wyrenderowane, gdy wywoływana jest akcja . Akcje podrzędne są zwykle powiązane z widokami częściowymi, chociaż nie jest to obowiązkowe.
[ChildActionOnly] dzięki czemu ograniczony dostęp za pośrednictwem kodu w widoku
wdrożenie informacji o stanie konkretnego adresu URL strony. Przykład: Płatność URL strony (płacąc tylko raz) składni maszynki pozwala wywołać konkretne działania warunkowe
Można go użyć, jeśli używasz RenderAction
w dowolnym z widoków, zwykle do renderowania częściowego widoku.
Powodem oznaczenia go za pomocą [ChildActionOnly]
jest to, że metoda kontrolera musi być publiczna, aby można było wywołać ją pod numerem RenderAction
, ale nie chcesz, aby ktoś mógł nawigować po adresie URL (np./Controller/SomeChildAction) i zobacz wyniki tej akcji bezpośrednio.
Podobny do [NonAction]. to jest? jaka to różnica? – DarthVader
@DarthVader - Podobne, ale z [NonAction] nie można go nazwać za pomocą 'RenderAction' albo –
@EricPetroelje: Co może być zaletami oznaczania metody działania jako' NonActionAttribute' w prawdziwych projektach? – wuhcwdc
Z [ChildActionOnly] atrybutu adnotacją, metoda działania można nazwać tylko jako metoda dziecka z obrębu widok. Oto przykład dla [ChildActionOnly]..
Istnieją dwie metody działania: Index() i MyDateTime() i odpowiednie widoki: Index.cshtml i MyDateTime.cshtml. to HomeController.cs
public class HomeController : Controller
{
public ActionResult Index()
{
ViewBag.Message = "This is from Index()";
var model = DateTime.Now;
return View(model);
}
[ChildActionOnly]
public PartialViewResult MyDateTime()
{
ViewBag.Message = "This is from MyDateTime()";
var model = DateTime.Now;
return PartialView(model);
}
}
Oto widok na Index.cshtml.
@model DateTime
@{
ViewBag.Title = "Index";
}
<h2>
Index</h2>
<div>
This is the index view for Home : @Model.ToLongTimeString()
</div>
<div>
@Html.Action("MyDateTime") // Calling the partial view: MyDateTime().
</div>
<div>
@ViewBag.Message
</div>
Oto MyDateTime.cshtml częściowy widok.
@model DateTime
<p>
This is the child action result: @Model.ToLongTimeString()
<br />
@ViewBag.Message
</p>
if you run the application and do this request http://localhost:57803/home/mydatetime The result will be Server Error like so:
Oznacza to, że nie można bezpośrednio wywołać częściowy widok. ale może być wywołana poprzez Index() widok jak w Index.cshtml
@Html.Action("MyDateTime") // Calling the partial view: MyDateTime().
If you remove [ChildActionOnly] and do the same request http://localhost:57803/home/mydatetime it allows you to get the mydatetime partial view result:
This is the child action result. 12:53:31 PM
This is from MyDateTime()
Trochę późno do partii, ale ...
innych odpowiedzi zrobić dobrą robotę wyjaśnienie, jaki wpływ ma atrybut [ChildActionOnly]
.Jednak w większości przypadków wciąż zadawałem sobie pytanie, dlaczego utworzyłem nową metodę działania tylko po to, aby wyrenderować częściowy widok w innym widoku, kiedy można po prostu renderować bezpośrednio w widoku @Html.Partial("_MyParialView")
. Wyglądało to na niepotrzebną warstwę. Jednak, jak badałem, odkryłem, że jedną z korzyści jest to, że akcja potomna może stworzyć inny model i przekazać go do widoku częściowego. Model potrzebny dla częściowego może nie być dostępny w modelu widoku, w którym renderowany jest widok częściowy. Zamiast modyfikować strukturę modelu, aby uzyskać niezbędne obiekty/właściwości, aby wyświetlić widok częściowy, można wywołać działanie potomne i zastosować metodę działania, aby utworzyć model potrzebny 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 na osiągnięcie tego jest użycie podstawowego modelu widoku i wszystkie inne modele widoku dziedziczą z niego. Następnie _Layout
może korzystać z podstawowego modelu widoku i wspólnych właściwości. Minusem (co jest subiektywne) jest to, że wszystkie modele widoku muszą dziedziczyć z podstawowego modelu widoku, aby zagwarantować, że te wspólne właściwości są zawsze dostępne. Alternatywą jest renderowanie @Html.Action
w tych popularnych miejscach. Metoda działania utworzyłaby osobny model potrzebny do częściowego widoku wspólnego dla wszystkich stron, co nie wpłynęłoby na model dla "głównego" widoku. W tym przypadku strona _Layout
nie musi mieć modelu. Wynika z tego, że wszystkie inne modele widoku nie muszą dziedziczyć z żadnego modelu widoku podstawowego.
Jestem pewna, że istnieją inne powody używania atrybutu [ChildActionOnly]
, ale wydaje mi się to dobre dla mnie, więc pomyślałem, że się podzielę.
FYI, [ChildActionOnly] nie jest dostępna w środowisku ASP.NET MVC Core. zobacz niektóre informacje: here
public class HomeController : Controller
{
public ActionResult Index()
{
ViewBag.TempValue = "Index Action called at HomeController";
return View();
}
[ChildActionOnly]
public ActionResult ChildAction(string param)
{
ViewBag.Message = "Child Action called. " + param;
return View();
}
}
The code is initially invoking an Index action that in turn returns two Index views and at the View level it calls the ChildAction named “ChildAction”.
@{
ViewBag.Title = "Index";
}
<h2>
Index
</h2>
<!DOCTYPE html>
<html>
<head>
<title>Error</title>
</head>
<body>
<ul>
<li>
@ViewBag.TempValue
</li>
<li>@ViewBag.OnExceptionError</li>
@*<li>@{Html.RenderAction("ChildAction", new { param = "first" });}</li>@**@
@Html.Action("ChildAction", "Home", new { param = "first" })
</ul>
</body>
</html>
Copy and paste the code to see the result .thanks
- 1. ASP MVC ChildActionOnly powinien mieć routing
- 2. Używanie npm z projektem MVC
- 3. Używanie niestandardowej autoryzacji w MVC 4
- 4. Używanie ASP.NET MVC z ogólnymi widokami
- 5. Używanie tabel Zend Framework Db bez MVC
- 6. Aplikacja MVC powodująca używanie IE9 starszych standardów
- 7. Używanie mvc-mini-profilera z ADO.NET SqlConnection
- 8. Używanie atrybutu wiązania w klasie ViewModel w ASP.NET MVC
- 9. Używanie Miniprofilatora MVC do każdego wywołania akcji
- 10. Używanie Server.MapPath() wewnątrz statycznego pola w ASP.NET MVC
- 11. Używanie plików cookie do przechowywania sesji w ASP MVC
- 12. Używanie w Razor VB.net MVC nie działa zgodnie z oczekiwaniami
- 13. C# i ASP.NET MVC: Używanie dyrektywy #if w widoku
- 14. Używanie Kendo MultiSelect z Kendo UI Grid w ASP.NET MVC
- 15. Używanie zasobów z komunikatem o błędzie w mvc
- 16. Używanie CDN w pakiecie skryptów MVC. czego mi brakuje?
- 17. MVC-ControllerTypeCache.xml w MVC
- 18. Używanie WiX do generowania instalatora strony ASP.Net MVC
- 19. Używanie filtrów akcji na MVC C# za pomocą string zapytanie
- 20. Uprawnienie ASP.NET MVC i pozwolenie na używanie klas modeli
- 21. Używanie programu Access-Control-Allow-Origin z MVC
- 22. IdentityServer4 - Używanie odświeżania tokenów po wykonaniu Quickstart for Hybrid MVC
- 23. Używanie tras Asp.Net MVC z aplikacji innych niż web (testy)
- 24. Używanie opisu stanu w HttpUnauthorizedResult
- 25. Wiosna MVC GET/przekierowanie/POST
- 26. Odpowiednik aplikacji Django w ASP.NET MVC?
- 27. Prawidłowy sposób odniesienia JavaScript w ASP.NET MVC?
- 28. BestPractices: Czy dopuszczalne jest używanie więcej niż jednego repozytorium w kontrolerze MVC?
- 29. Formularz księgowania bez @ HTML.Beginform i używanie Jquery (ajax) w asp.net MVC
- 30. ASP.NET MVC - Używanie cURL lub podobnego do wykonywania żądań w aplikacji
. Możesz użyć kodu do jego wyjaśnienia Proszę? –
Odpowiedź jest dobra. Mogłoby być lepiej, gdyby dodać trochę kodu. – Garry
Przykładowe użycie w widoku: <% Html.RenderAction ("MyChildAction", "MyController"); %>. W ten sposób nie można nazwać działania dzieci z GET i routingu –