Quiero poder marcar una acción en el controlador para que se llame tanto desde llamadas ajax como a través de RenderAction. El problema es que ambos atributos derivan o implementan diferentes abstracciones. Una salida es la siguiente:Combinación de AjaxOnlyAttribute y ChildActionOnlyAttribute en un filtro de acción
[AjaxOnly]
PartialViewResult GetViewAjax(int foo) { return GetView(foo); }
[ChildActionOnly]
PartialViewResult GetView(int foo) { ... }
Pero esto no está del todo limpio.
El AjaxOnly atributo que estoy hablando es la siguiente: se toma
public sealed class AjaxOnlyAttribute : ActionFilterAttribute
{
#region Public members
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext == null)
throw new ArgumentNullException("filterContext");
if (filterContext.HttpContext.Request.Headers["X-Requested-With"] != "XMLHttpRequest")
filterContext.Result = new HttpNotFoundResult();
}
#endregion
}
Este método de futuros MvC3. Un comentario importante por la que la condición no se filterContext.HttpContext.Request.IsAjaxRequest()
fue hecho por el equipo de desarrollo y dice lo siguiente:
// Dev10 #939671 - If this attribute is going to say AJAX *only*, then we need to check the header
// specifically, as otherwise clients can modify the form or query string to contain the name/value
// pair we're looking for.
¿Por qué? Supongamos que su acción se vuelve a utilizar desde diferentes lugares a través de RenderAction() y las solicitudes ajax. Supongamos que se vuelven a usar en diferentes páginas como algo que se dibuja en un panel de herramientas estándar para muchos lugares y se usa ligeramente diferente en contextos diferentes –
@Hohhi, por lo que desea que su acción sea accesible solo a través de una llamada AJAX o como acción infantil ? –
Exactamente, gracias por su sugerencia, actualizaría la pregunta y le diría cuánto llegué en algún momento –