169 votes

À l'aide de ChildActionOnly en MVC

Quand voulez-vous utiliser l'attribut ChildActionOnly? Qu'est ce qu'un ChildAction et dans ce cas, vous souhaitez restreindre une action à l'aide de cet attribut?

162voto

Thomas Jaskula Points 5914

L' ChildActionOnly attribut permet à l'action de la méthode peut être appelée uniquement comme un enfant de la méthode dans une vue. Une méthode d'action n'a pas besoin d'avoir cet attribut pour être utilisé comme un enfant d'action, mais nous avons tendance à utiliser cet attribut pour prévenir les méthodes d'action de l'être invoquée comme un résultat d'un utilisateur demande. Après avoir défini une méthode d'action, nous avons besoin de créer ce qui sera affiché lorsque l'action est invoquée. Enfant des actions sont habituellement associés avec vue partielle sur, mais ce n'est pas obligatoire.

129voto

yantaq Points 142

Avec [ChildActionOnly] attribut annoté, une méthode d'action ne peut être appelé qu'en tant qu'enfant de la méthode à partir de l'intérieur d'un point de vue. Voici un exemple pour [ChildActionOnly]..

il existe deux méthodes d'action: Index() et MyDateTime (la) et correspondant Vues: Index.cshtml et MyDateTime.cshtml. c'est 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);
    } 
}

Ici est le point de vue de l'Indice.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>

Voici MyDateTime.cshtml vue partielle.

@model DateTime

<p>
This is the child action result: @Model.ToLongTimeString()
<br />
@ViewBag.Message
</p>
 si vous exécutez l'application et de faire cette demande http://localhost:57803/home/mydatetime
(numéro de port est spécifique à ma VS, vous pouvez obtenir différents de port). le résultat sera d'Erreur du Serveur comme ceci: 

enter image description here

Cela signifie que vous ne pouvez pas appeler directement la vue partielle. mais elle peut être appelée via l'Index() de la vue comme dans l'Index.cshtml

 @Html.Action("MyDateTime") // Appel de la vue partielle: MyDateTime().
 
Si vous supprimez [ChildActionOnly] et de faire la même demande http://localhost:57803/home/mydatetime il vous permet d'obtenir le mydatetime vue partielle résultat:
This is the child action result. 12:53:31 PM 
This is from MyDateTime()

75voto

Eric Petroelje Points 40734

Vous pouvez l'utiliser si vous utilisez RenderAction de vos points de vue, généralement de rendre une vue partielle.

La raison pour marquage avec [ChildActionOnly] , c'est que vous avez besoin de la méthode de contrôleur à être public, de sorte que vous pouvez l'appeler avec RenderAction mais vous ne voulez pas que quelqu'un puisse accéder à une URL (par exemple: /Contrôleur/SomeChildAction) et de voir les résultats de cette action directement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X