2010-11-12 12 views
11

Szukam sposobu na wymuszenie działania kontrolera, aby uzyskać dostęp tylko za pośrednictwem żądania AJAX.ASP.NET MVC: Wymuszenie żądania AJAX w działaniu

Jaki jest najlepszy sposób, aby to zrobić przed wywołaniem metody działania? Chcę byłaby następujących z moich metod działania:

if(Request.IsAjaxRequest()) 
    // Do something 
else 
    // return an error of some sort 

Co jestem Przewidując to ActionMethodSelectorAttribute, które mogą być używane jak atrybutu [AcceptVerbs]. Nie mam jednak doświadczenia w tworzeniu takiego niestandardowego atrybutu.

Odpowiedz

17

Załóż ActionFilter że pożary OnActionExecuting

public class AjaxActionFilter : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if (!filterContext.HttpContext.Request.IsAjaxRequest()) 
      filterContext.Result = new RedirectResult(//path to error message);   
    } 
} 

Ustawianie właściwości Wynik filtru uniemożliwi wykonanie ActionMethod.

Możesz następnie zastosować go jako atrybut do ActionMethods.

+0

+1 z przedstawionych sposobów, jest to zdecydowanie najbliższy mojemu preferowanemu podejściu i jest rozszerzalny, szczególnie jeśli jest umieszczony w kontrolerze base, który wszyscy inni dziedziczą po –

2

Jest to tak proste, jak:

public class AjaxOnly : ActionMethodSelectorAttribute 
{ 
    public override bool IsValidForRequest(ControllerContext controllerContext, System.Reflection.MethodInfo methodInfo) 
    { 
     return controllerContext.HttpContext.IsAjaxRequest(); 
    } 
} 

po prostu zapomnieć, gdzie IsAjaxRequest() pochodzi, ja wklejanie z kodem mam ale „zagubiony” tej metody. ;)

+0

Ooops, nie dostał części o zwrócenie błędu. To sprawia, że ​​metoda nigdy go nie dostanie, chyba że żądanie to Ajax. To kolejny sposób na zrobienie tego. – jfar

+0

Wiem, że ta odpowiedź została wysłana wcześniej, ale IsAjaxRequest zawiesza się w obiekcie żądania, a nie w Httpcontext. – heymega