ASP.NET MVC: принудительное применение AJAX-запроса к действию - PullRequest
11 голосов
/ 12 ноября 2010

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

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

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

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

Ответы [ 2 ]

17 голосов
/ 12 ноября 2010

Создайте 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 голосов
/ 12 ноября 2010

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

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

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

...