ASP.NET MVC:对操作强制执行A​​JAX请求

时间:2010-11-12 19:31:18

标签: asp.net-mvc ajax actionmethod controller-action

我正在寻找一种方法来强制执行只能通过AJAX请求访问控制器的操作。

在调用操作方法之前执行此操作的最佳方法是什么?我想从我的操作方法中重构以下内容:

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

我想象的是ActionMethodSelectorAttribute可以像[AcceptVerbs]属性一样使用。我没有经验包装这样的自定义属性。

2 个答案:

答案 0 :(得分:17)

创建一个触发OnActionExecuting

的ActionFilter
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。

答案 1 :(得分:2)

这很简单:

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

我只是忘记了IsAjaxRequest()的来源,我从代码中粘贴但是“丢失”了这种方法。 ;)