我正在寻找一种方法来强制执行只能通过AJAX请求访问控制器的操作。
在调用操作方法之前执行此操作的最佳方法是什么?我想从我的操作方法中重构以下内容:
if(Request.IsAjaxRequest())
// Do something
else
// return an error of some sort
我想象的是ActionMethodSelectorAttribute
可以像[AcceptVerbs]
属性一样使用。我没有经验包装这样的自定义属性。
答案 0 :(得分:17)
创建一个触发OnActionExecuting
的ActionFilterpublic 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()的来源,我从代码中粘贴但是“丢失”了这种方法。 ;)