2012-04-20 12 views

Odpowiedz

135

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.

  1. [ChildActionOnly] dzięki czemu ograniczony dostęp za pośrednictwem kodu w widoku

  2. 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

+1

. Możesz użyć kodu do jego wyjaśnienia Proszę? –

+2

Odpowiedź jest dobra. Mogłoby być lepiej, gdyby dodać trochę kodu. – Garry

+0

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 –

67

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.

+2

Podobny do [NonAction]. to jest? jaka to różnica? – DarthVader

+9

@DarthVader - Podobne, ale z [NonAction] nie można go nazwać za pomocą 'RenderAction' albo –

+0

@EricPetroelje: Co może być zaletami oznaczania metody działania jako' NonActionAttribute' w prawdziwych projektach? – wuhcwdc

96

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:

enter image description here

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() 
+1

Bardzo opisowe – Red

+7

dzięki, lepsze wyjaśnienie niż zaakceptowana odpowiedź – joym8

3

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ę.

5

FYI, [ChildActionOnly] nie jest dostępna w środowisku ASP.NET MVC Core. zobacz niektóre informacje: here

0
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 
Powiązane problemy