Desidero poter contrassegnare un'azione sul controller da chiamare sia da chiamate ajax che tramite RenderAction. Il problema è che entrambi questi attributi derivano o implementano diverse astrazioni. Una via d'uscita è la seguente:Combinazione di AjaxOnlyAttribute e ChildActionOnlyAttribute in un filtro di azione
[AjaxOnly]
PartialViewResult GetViewAjax(int foo) { return GetView(foo); }
[ChildActionOnly]
PartialViewResult GetView(int foo) { ... }
Ma questo non è affatto pulito.
L'AjaxOnly attributo di cui sto parlando è:
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
}
Questo metodo è tratto da futuri MVC3. Un commento importante per cui la condizione non filterContext.HttpContext.Request.IsAjaxRequest()
è stata fatta dal team di dev e dice quanto segue:
// 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.
Perché? Supponiamo che la tua azione venga riutilizzata da diverse posizioni sia tramite RenderAction() che ajax. Supponiamo che questi vengano riutilizzati su pagine diverse come smth che disegnano alcuni strumenti standard per molti posti e sono usati in modi diversi in contesti diversi –
@Hohhi, quindi vuoi che l'azione sia accessibile solo tramite una chiamata AJAX o come azione Child ? –
Esattamente, grazie per il tuo suggerimento, vorrei aggiornare la domanda e dire fino a che punto arriva in un certo tempo –