ASP.NET MVC: принудительно выполнить запрос AJAX на действие

Я ищу способ принудительного выполнения действия контроллера, доступ к которому возможен только через запрос AJAX.

Каков наилучший способ сделать это до вызова метода действия? Я хочу реорганизовать следующее из моих методов действий:

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

То, что я представляю, - это ActionMethodSelectorAttribute, который может использоваться как атрибут [AcceptVerbs]. Однако у меня нет опыта в создании такого настраиваемого атрибута.

Ответ 1

Создайте ActionFilter, который запускает OnActionExecuting

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

Настройка свойства Result фильтра предотвратит выполнение ActionMethod.

Затем вы можете применить его как атрибут к вашим ActionMethods.

Ответ 2

Это так просто:

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

Я просто забываю, откуда приходит IsAjaxRequest(), я вставляю код, который у меня есть, но "потерял" этот метод.;)