我正在寻找一种方法来强制仅通过 AJAX 请求访问控制器的操作。
在调用操作方法之前执行此操作的最佳方法是什么?我想从我的操作方法中重构以下内容:
if(Request.IsAjaxRequest())
// Do something
else
// return an error of some sort
我的设想是ActionMethodSelectorAttribute可以像[AcceptVerbs]属性一样使用。不过,我没有创建这样一个自定义属性的经验。
我正在寻找一种方法来强制仅通过 AJAX 请求访问控制器的操作。
在调用操作方法之前执行此操作的最佳方法是什么?我想从我的操作方法中重构以下内容:
if(Request.IsAjaxRequest())
// Do something
else
// return an error of some sort
我的设想是ActionMethodSelectorAttribute可以像[AcceptVerbs]属性一样使用。不过,我没有创建这样一个自定义属性的经验。
创建一个触发 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。
它就像这样简单:
public class AjaxOnly : ActionMethodSelectorAttribute
{
public override bool IsValidForRequest(ControllerContext controllerContext, System.Reflection.MethodInfo methodInfo)
{
return controllerContext.HttpContext.IsAjaxRequest();
}
}
我只是忘记了 IsAjaxRequest() 来自哪里,我正在粘贴我拥有但“丢失”该方法的代码。;)