2012-04-20 12 views

Respuesta

135

El atributo ChildActionOnly garantiza que un método de acción solo se puede llamar como un método secundario desde una vista. No es necesario que un método de acción tenga este atributo para usarse como una acción secundaria, pero tendemos a usar este atributo para evitar que los métodos de acción se invoquen como resultado de una solicitud de usuario . Después de haber definido un método de acción, debemos crear lo que se representará cuando se invoque la acción . Las acciones secundarias suelen asociarse a vistas parciales, aunque esto no es obligatorio.

  1. [ChildActionOnly] lo que permite un acceso restringido a través de código en la vista

  2. aplicación Estatal de Información para el URL de la página específica. Ejemplo: Pago URL de la página (el pago de una sola vez) sintaxis de afeitar permite llamar a acciones específicas condicionales

+1

¿Podría poner algún código para aclararlo? ¿Por favor? –

+2

La respuesta es buena. Podría ser mejor si agrega un código. – Garry

+0

Ejemplo de uso en una vista: <% Html.RenderAction ("MyChildAction", "MyController"); %>. Por lo tanto no se puede llamar una acción niño con GET y código de enrutamiento –

67

Lo usará si está utilizando RenderAction en cualquiera de sus vistas, generalmente para hacer una vista parcial.

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

+2

similar a [no-acción]. ¿Lo es? ¿Cuál es la diferencia entonces? – DarthVader

+9

@DarthVader - Similar, pero con [NonAction] no podría llamarlo usando 'RenderAction' –

+0

@EricPetroelje: ¿Cuáles pueden ser los beneficios de marcar el Método de acción como' NonActionAttribute' en proyectos reales? – wuhcwdc

96

Con [ChildActionOnly] atributo anotada, un método de acción puede ser llamado sólo como un método niño dentro de una ver. Aquí hay un ejemplo para [ChildActionOnly]..

hay dos métodos de acción: Index() y MyDateTime() y Views 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); 
    } 
} 

Esta es la opinión de 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í es MyDateTime.cshtml vista parcial.

@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

Esto significa que no puede llamar directamente a la vista parcial. pero se le puede llamar a través del índice() vista como la de la 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

Muy descriptivo – Red

+7

gracias, mejor explicación que la respuesta aceptada – joym8

3

Un poco tarde a la fiesta, pero ...

Las otras respuestas hacen un buen trabajo de explicando 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 representar una vista parcial, dentro de otra vista, cuando simplemente podía renderizar @Html.Partial("_MyParialView") directamente en la vista. Parecía una capa innecesaria. Sin embargo, cuando investigué, descubrí que un beneficio es que la acción infantil puede crear un modelo diferente y pasarlo a la vista parcial. El modelo necesario para el parcial podría no estar disponible en el modelo de la vista en la que se está representando la vista parcial. En lugar de modificar la estructura del modelo para obtener los objetos/propiedades necesarios solo para representar la vista parcial, puede llamar a la acción secundaria y hacer que el método de acción 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 utilizar un modelo de vista base y heredar de él todos los demás modelos de vista. Luego, 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 hacer @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, lo que no afectaría el modelo para la vista "principal". En esta alternativa, la página _Layout no necesita tener un modelo. Se deduce que 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 esta me parece una buena, así que pensé en compartirla.

5

FYI, [ChildActionOnly] no está disponible en ASP.NET MVC Core. ver algo de información 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 
Cuestiones relacionadas