Utilizzo di ChildActionOnly in MVC

Quando ChildActionOnly l’attributo ChildActionOnly ? Che cos’è un’azione ChildAction e in quale circostanza vorresti limitare un’azione utilizzando questo attributo?

L’attributo ChildActionOnly garantisce che un metodo di azione possa essere chiamato solo come metodo figlio da una vista. Non è necessario che un metodo di azione utilizzi questo attributo come azione figlio, ma tendiamo a utilizzare questo attributo per impedire che i metodi di azione vengano richiamati come risultato di una richiesta dell’utente. Avendo definito un metodo di azione, abbiamo bisogno di creare ciò che sarà reso quando l’azione è invocata. Le azioni secondarie sono in genere associate a viste parziali, sebbene ciò non sia obbligatorio.

  1. [ChildActionOnly] che consente l’accesso limitato tramite codice in Visualizza

  2. Implementazione delle informazioni di stato per un URL di pagina specifico. Esempio: l’URL della pagina di pagamento (pagando una sola volta) la syntax del razor consente di chiamare condizionali azioni specifiche

Con l’attributo [ChildActionOnly] annotato, un metodo di azione può essere chiamato solo come metodo figlio da una vista. Ecco un esempio per [ChildActionOnly]. .

esistono due metodi di azione: Index () e MyDateTime () e Visualizzazioni corrispondenti: Index.cshtml e MyDateTime.cshtml. questo è 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); } } 

Ecco la vista per Index.cshtml .

 @model DateTime @{ ViewBag.Title = "Index"; } 

Index

This is the index view for Home : @Model.ToLongTimeString()
@Html.Action("MyDateTime") // Calling the partial view: MyDateTime().
@ViewBag.Message

Ecco la vista parziale MyDateTime.cshtml .

 @model DateTime 

This is the child action result: @Model.ToLongTimeString()
@ViewBag.Message

  se si esegue l'applicazione e si esegue questa richiesta http: // localhost: 57803 / home / mydatetime
  Il risultato sarà Errore del server in questo modo: 

inserisci la descrizione dell'immagine qui

Questo significa che non puoi chiamare direttamente la vista parziale. ma può essere chiamato tramite la vista Index () come in Index.cshtml

      @ Html.Action ("MyDateTime") // Chiamando la vista parziale: MyDateTime ().
 

  Se rimuovi [ChildActionOnly] ed esegui la stessa richiesta http: // localhost: 57803 / home / mydatetime, ti consente di ottenere il risultato della vista parziale mydatetime: 
 This is the child action result. 12:53:31 PM This is from MyDateTime() 

Lo RenderAction se stai usando RenderAction in una delle tue visualizzazioni, di solito per renderizzare una vista parziale.

Il motivo per contrassegnarlo con [ChildActionOnly] è che hai bisogno che il metodo del controller sia pubblico, quindi puoi chiamarlo con RenderAction ma non vuoi che qualcuno sia in grado di navigare verso un URL (ad esempio / Controller / SomeChildAction) e vedere i risultati di quell’azione direttamente.

Cordiali saluti, [ChildActionOnly] non è disponibile in ASP.NET MVC Core. vedere alcune informazioni qui

Un po ‘tardi per la festa, ma …

Le altre risposte fanno un buon lavoro per spiegare quale effetto ha l’attributo [ChildActionOnly] . Tuttavia, nella maggior parte degli esempi, ho continuato a chiedermi perché avrei creato un nuovo metodo di azione solo per rendere una vista parziale, all’interno di un’altra vista, quando potevi semplicemente renderizzare @Html.Partial("_MyParialView") direttamente nella vista. Sembrava uno strato non necessario. Tuttavia, come ho studiato, ho scoperto che un vantaggio è che l’azione figlio può creare un modello diverso e passarlo alla vista parziale. Il modello necessario per il partial potrebbe non essere disponibile nel modello della vista in cui viene eseguito il rendering della vista parziale. Invece di modificare la struttura del modello per ottenere gli oggetti / le proprietà necessarie solo per il rendering della vista parziale, è ansible chiamare l’azione figlio e fare in modo che il metodo di azione si occupi della creazione del modello necessario per la vista parziale.

Questo può tornare utile, ad esempio, in _Layout.cshtml . Se si dispone di alcune proprietà comuni a tutte le pagine, un modo per ottenere ciò è utilizzare un modello di vista di base e ereditare da esso tutti gli altri modelli di visualizzazione. Quindi, _Layout può utilizzare il modello di visualizzazione di base e le proprietà comuni. Lo svantaggio (che è soggettivo) è che tutti i modelli di vista devono ereditare dal modello di vista di base per garantire che tali proprietà comuni siano sempre disponibili. L’alternativa è rendere @Html.Action in quei luoghi comuni. Il metodo action creerebbe un modello separato necessario per la vista parziale comune a tutte le pagine, che non avrebbe alcun impatto sul modello per la vista “principale”. In questa alternativa, la pagina _Layout non deve avere un modello. Ne consegue che tutti gli altri modelli di vista non devono necessariamente ereditare da qualsiasi modello di vista di base.

Sono sicuro che ci sono altri motivi per usare l’attributo [ChildActionOnly] , ma questo mi sembra buono, quindi ho pensato di condividerlo.

  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"; } 

Index

< !DOCTYPE html> Error
  • @ViewBag.TempValue
  • @ViewBag.OnExceptionError
  • @*
  • @{Html.RenderAction("ChildAction", new { param = "first" });}
  • @**@ @Html.Action("ChildAction", "Home", new { param = "first" })
Copy and paste the code to see the result .thanks