Chcę móc zaznaczyć akcję na kontrolerze, która będzie wywoływana zarówno z wywołań ajaxowych, jak i za pośrednictwem funkcji RenderAction. Problem polega na tym, że oba te atrybuty wyprowadzają lub implementują różne abstrakcje. Jedno wyjście jest następujące:Łączenie AjaxOnlyAttribute i ChildActionOnlyAttribute w jeden filtr akcji
[AjaxOnly]
PartialViewResult GetViewAjax(int foo) { return GetView(foo); }
[ChildActionOnly]
PartialViewResult GetView(int foo) { ... }
Ale to wcale nie jest miłe.
AjaxOnly przypisują mówię to:
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
}
Metoda ta jest pobierana z kontraktami MVC3. Ważnym komentarz dlaczego warunek nie jest filterContext.HttpContext.Request.IsAjaxRequest()
została wykonana przez zespół dev i mówi co następuje:
// 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.
Dlaczego? Załóżmy, że twoja akcja jest ponownie używana z różnych miejsc, zarówno przez żądania RenderAction(), jak i ajax. Załóżmy, że są one ponownie używane na różnych stronach jako coś, co powoduje rysowanie standardowego panelu narzędzi w wielu miejscach i jest używane nieco inaczej w różnych kontekstach. –
@Hohhi, więc chcesz, aby Twoje działanie było dostępne tylko przez wywołanie AJAX lub działanie jako dziecko ? –
Dokładnie, dziękuję za twoją sugestię, zaktualizowałbym pytanie i powiedziałbym, jak daleko zajdę w pewnym czasie –