2

カスタム承認属性を定義しました。コントローラーのすべての ActionResult の上に属性をリストすることを避けるために、次のように属性を global.asax に追加しました。

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new MyAuthorizeAttribute());
}

ただし、これの意図しない結果は、すべての JsonResult 呼び出し中に認証コードが呼び出されることです。MyAuthorizeAttribute が JsonResult 呼び出しではなく ActionResult 呼び出しでのみ呼び出される方法はありますか? MVC3を使用しています。

4

2 に答える 2

1

フィルターはアクション メソッドの前または後に実行されますか?

以前に実行された場合、すべてのアクションが ActionResult を返すため、どの具体的な型が返されるかわかりません (特に JsonResult を返さない限り、それは別の話です)。

アクション メソッドの後に実行する場合は、フィルタ コードで結果が JsonResult かどうかを次のように確認します。

    public override void OnResultExecuting(ResultExecutingContext filterContext)
    {
        if (!(filterContext.Result is JsonResult))
        {
            // do whatever you want...
        }

        base.OnResultExecuting(filterContext);
    }
于 2011-08-22T14:42:36.737 に答える
0

私は前の答えに同意しません。あなたは間違った目的からこれに近づいたようです。戻り値の型ではなく、要求の型を確認する必要があります。

フィルターのアクションの前に Ajax リクエストを確認できます。あなたはこのようなものを持っている必要があります...

public class MyAuthorizeAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (filterContext.HttpContext.Request.IsAjaxRequest())
            return;

        // else do authorisation stuff...
    }
} 
于 2012-01-31T14:51:30.560 に答える