7

ActionExecutingContextのCancelプロパティはどうなりましたか?ActionFilterAttributeを使用するときにRenderActionを中止するにはどうすればよいですか、それともこの猫の皮を剥ぐ別の方法はありますか?

  public override void OnActionExecuting(ActionExecutingContext filterContext)
  {
   if(!filterContext.HttpContext.User.Identity.IsAuthenticated)
   {
    return;
   }
   base.OnActionExecuting(filterContext);
  }

上記のコードは、OnActionExecuting操作を終了しても、適用されたアクションを実行し続けますか?

---元の投稿へさらに: 以下の回答に感謝しますが、コンテキストを十分に明確にしたとは思いません。次の呼び出しを無効にしようとしています。

<% Html.RenderAction("Menu", "Shared", new { id = Model.OtherUserId }); %>

ユーザーが認証されていない場合、このアクションは何も返さないはずです。ビューに「if」ブロックを簡単に配置できますが、ルールをコントローラーに保持したいと思います。

4

3 に答える 3

14

これはマティアスの素晴らしい仕事でした。結果は次のとおりです。

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
        {
            filterContext.Result = new EmptyResult();
            return;
        }
        base.OnActionExecuting(filterContext);
    }
于 2010-01-26T16:31:26.740 に答える
3

いいえ、アクション フィルターからレンダリングをキャンセルすることはできません。そうしてはいけない理由はたくさんあります。クライアントは何を見るでしょうか?エラーページ?何もない?

サインインしていない場合に何か他のものをレンダリングする承認アクションフィルターを構築していると思います。フレームワークには、サインインしていない場合にログインページにリダイレクトするもの (AuthorizeAttribute) が既にあります。フレームワークでは、実行中の結果を変更します (filterContext.Result = [[new result]];)。動作が気に入らない場合は、独自の実装を構築できます。

それでもレンダリングなどをキャンセルする必要がある場合は、独自の ActionResult を作成し、必要なロジックを Execute メソッドで実行する必要があります。

- アップデート -

レンダリング アクションを使用する場合は、コントローラーにロジックを配置し、サインインしていない場合は空の結果を返す必要があります (フレームワークには「EmptyResult」というアクション結果があります)。そのようなロジックはコントローラー アクションに属します。

于 2010-01-26T12:13:07.353 に答える