¿Cuándo utilizaría el atributo ChildActionOnly
? ¿Qué es un ChildAction
y en qué circunstancias quisiera restringir una acción usando este atributo?Uso de ChildActionOnly en MVC
Respuesta
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.
[ChildActionOnly] lo que permite un acceso restringido a través de código en la vista
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
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.
similar a [no-acción]. ¿Lo es? ¿Cuál es la diferencia entonces? – DarthVader
@DarthVader - Similar, pero con [NonAction] no podría llamarlo usando 'RenderAction' –
@EricPetroelje: ¿Cuáles pueden ser los beneficios de marcar el Método de acción como' NonActionAttribute' en proyectos reales? – wuhcwdc
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:
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()
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.
FYI, [ChildActionOnly] no está disponible en ASP.NET MVC Core. ver algo de información here
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
- 1. Ejemplos MVC uso de var
- 2. Uso de RedirectToAction en asp.net mvc
- 3. Uso de cookies en asp.net mvc C#
- 4. ¿Cómo uso Application_Error en ASP.NET MVC?
- 5. Uso de MVC HtmlHelper desde un WebForm
- 6. Uso de ASP.NET MVC con vistas genéricas
- 7. Uso de ASP.NET MVC con Classic ADO.Net
- 8. Uso de NServiceBus con Asp.Net MVC 2
- 9. uso de la lista de selección en asp.net mvc
- 10. Ejemplo de uso de AdditionalMetadata en MVC 3
- 11. El uso de símbolos de compilación condicional en vistas MVC
- 12. El uso de XSLT en ASP .NET MVC 3
- 13. Uso de cookies para almacenar sesiones en ASP MVC
- 14. Uso de ViewModel en ASP.NET MVC con FluentValidation
- 15. Uso de un modelo genérico en ASP.NET MVC Razor
- 16. Uso de vistas GSP en Spring MVC simple sin Grails
- 17. ASP.NET MVC 2 - ¿Cómo uso DropDownListFor?
- 18. ASP.net MVC Controller - Uso del constructor
- 19. ¿Cómo uso Comet con Spring MVC?
- 20. ¿Cómo omito la codificación HTML cuando uso Html.ActionLink en Mvc?
- 21. ¿Qué es el uso del atributo UIHint en MVC
- 22. Uso de más de un controlador con ExtJS 4 MVC
- 23. El uso de la maquinilla de afeitar sin MVC
- 24. Uso de MVC para nuevas partes de un proyecto Webforms
- 25. Uso de Spring Validator fuera del contexto de Spring MVC
- 26. Spring MVC - Mapa controlador a raíz de contexto (/) durante el uso de los recursos: mvc
- 27. ASP MVC ChildAction Solo debe tener el enrutamiento
- 28. Uso de ASP.NET MVC 2 con Ninject 2 desde cero
- 29. Asesoramiento sobre el uso de ASP.net WebForms o MVC
- 30. Código de uso compartido entre los controladores ASP.NET MVC
¿Podría poner algún código para aclararlo? ¿Por favor? –
La respuesta es buena. Podría ser mejor si agrega un código. – Garry
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 –