Uso de ChildActionOnly en MVC


¿Cuándo usarías el atributo ChildActionOnly? ¿Qué es un ChildAction y en qué circunstancia querría restringir una acción usando este atributo?

Author: tereško, 2012-04-21

6 answers

El ChildActionOnly atributo asegura que un método de acción puede ser llamado solo como un método hijo desde dentro de una vista. Un método de acción no necesita tener este atributo para ser utilizado como una acción hija, pero tendemos a usar este atributo para evitar que los métodos de acción sean invocados como resultado de un usuario solicitud. Habiendo definido un método de acción, necesitamos crear lo que se renderizará cuando la acción sea invocar. Las acciones secundarias se asocian típicamente con vistas parciales, aunque esto es no es obligatorio.

  1. [ChildActionOnly] permitiendo el acceso restringido a través de code in View

  2. Implementación de información de estado para URL de página específica. Ejemplo: URL de la página de pago (pagando solo una vez) la sintaxis de razor permite llamar a acciones específicas condicional

 145
Author: Tomasz Jaskuλa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-28 15:39:18

Con el atributo [ChildActionOnly] anotado, un método de acción solo se puede llamar como método hijo desde una vista. Aquí hay un ejemplo para [ChildActionOnly]..

hay dos métodos de acción: Index () y myDateTime () y Vistas correspondientes: Index.cshtml y myDateTime.cshtml. esto es 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);
    } 
}

Aquí está la vista para 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>

Aquí está myDateTime.cshtml parcial vista.

@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: 

introduzca la descripción de la imagen aquí

Esto significa que no puede llamar directamente a la vista parcial. pero se puede llamar a través de la vista Index () como en el Índice.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()
 106
Author: yantaq,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-09 20:22:43

Lo usaría si está usando RenderAction en cualquiera de sus vistas, generalmente para renderizar una vista parcial.

La razón para marcarlo con [ChildActionOnly] es que necesita que el método controlador sea público para que pueda llamarlo con RenderAction, pero no desea que alguien pueda navegar a una URL (por ejemplo, /Controller/SomeChildAction) y ver los resultados de esa acción directamente.

 68
Author: Eric Petroelje,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-20 21:26:48

Para su información, [ChildActionOnly] no está disponible en ASP.NET Núcleo MVC. ver algo de información aquí

 8
Author: Joe Wu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-14 21:53:05

Un poco tarde para la fiesta, pero...

Las otras respuestas hacen un buen trabajo al explicar qué efecto tiene el atributo [ChildActionOnly]. Sin embargo, en la mayoría de los ejemplos, me preguntaba por qué crearía un nuevo método de acción solo para renderizar una vista parcial, dentro de otra vista, cuando simplemente podría renderizar @Html.Partial("_MyParialView") directamente en la vista. Parecía una capa innecesaria. Sin embargo, mientras investigaba, encontré que un beneficio es que la acción del niño puede crear un modelo diferente y pasar eso a la vista parcial. Es posible que el modelo necesario para el parcial no esté disponible en el modelo de la vista en la que se está renderizando la vista parcial. En lugar de modificar la estructura del modelo para obtener los objetos/propiedades necesarios solo para renderizar la vista parcial, puede llamar a la acción hija y hacer que el método action se encargue de crear el modelo necesario para la vista parcial.

Esto puede ser útil, por ejemplo, en _Layout.cshtml. Si tiene algunas propiedades comunes a todas las páginas, una forma de lograr esto es usar un modelo de vista base y hacer que todos los demás modelos de vista hereden de él. Entonces, el _Layout puede usar el modelo de vista base y las propiedades comunes. La desventaja (que es subjetiva) es que todos los modelos de vista deben heredar del modelo de vista base para garantizar que esas propiedades comunes estén siempre disponibles. La alternativa es renderizar @Html.Action en esos lugares comunes. El método de acción crearía un modelo separado necesario para la vista parcial común a todas las páginas, que no impactar el modelo para la vista "principal". En esta alternativa, la página _Layout no necesita tener un modelo. De ello se deduce que todos los demás modelos de vista no necesitan heredar de ningún modelo de vista base.

Estoy seguro de que hay otras razones para usar el atributo [ChildActionOnly], pero esto me parece bueno, así que pensé en compartirlo.

 6
Author: neizan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-21 16:36:03
    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 
 0
Author: Hamid Nawaz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-21 18:38:56