11

コントローラーのアクションが AJAX リクエスト経由でのみアクセスされるようにする方法を探しています。

アクションメソッドが呼び出される前にこれを行う最良の方法は何ですか? アクションメソッドから以下をリファクタリングしたい:

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

私が想定しているのは、属性ActionMethodSelectorAttributeのように使用できるです。[AcceptVerbs]ただし、そのようなカスタム属性を作成した経験はありません。

4

2 に答える 2

17

Create an ActionFilter that fires OnActionExecuting

public class AjaxActionFilter : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (!filterContext.HttpContext.Request.IsAjaxRequest())
            filterContext.Result = new RedirectResult(//path to error message);           
    }
}

Setting the filter's Result property will prevent execution of the ActionMethod.

You can then apply it as an attribute to your 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 に答える