11

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

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

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

我的设想是ActionMethodSelectorAttribute可以像[AcceptVerbs]属性一样使用。不过,我没有创建这样一个自定义属性的经验。

4

2 回答 2

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。

于 2010-11-12T20:31:53.240 回答
2

它就像这样简单:

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

我只是忘记了 IsAjaxRequest() 来自哪里,我正在粘贴我拥有但“丢失”该方法的代码。;)

于 2010-11-12T20:41:32.323 回答