2

これは非常に簡単だと思いましたが、少し苦労しています。サイトを使用する前に、ユーザーが特定の条件に同意する必要がある MVC 3 を使用するクライアントのプロジェクトに取り組んでいます。最初にサイトにアクセスしたときに読み込まれる標準の同意/同意しない画面を作成しましたが、ユーザーがサイトの別の部分へのアドレスを入力すると、条件をバイパスできます。たとえば、www.test.com は条件を読み込みますが、ユーザーは www.test.com/home と入力し、条件をバイパスします。

サイトの他の場所にアクセスする前に、条件に同意したことを確認するにはどうすればよいですか? 私はセッション変数を試してみましたが、これが道だと思いますが、サイト上のすべてのコントローラーアクションにチェックを書き込まなくても、すべてのページリクエストでこの変数をチェックする方法はありますか?

4

2 に答える 2

6

カスタム属性を作成して、コントローラーの上部に追加できます。

例えば:

    [AgreedToDisclaimer]
    public ActionResult LoadPage()
    {
         return View();
    }

AgreedToDisclaimer が true を返す場合にのみビューをロードします。

public class AgreedToDisclaimerAttribute : AuthorizeAttribute
{

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
       if (httpContext == null)
        throw new ArgumentNullException("httpContext");

       // logic to check if they have agreed to disclaimer (cookie, session, database)
       return true;
    }

   protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
   {
          // Returns HTTP 401 by default - see HttpUnauthorizedResult.cs.
           filterContext.Result = new RedirectToRouteResult(
            new RouteValueDictionary 
            {
             { "action", "ActionName" },
             { "controller", "ControllerName" },
             { "parameterName", "parameterValue" }
            });
   }
}

http://msdn.microsoft.com/en-us/library/dd410209(v=vs.90).aspx

http://msdn.microsoft.com/en-us/library/system.web.mvc.authorizeattribute.handleunauthorizedrequest.aspx

于 2012-08-15T10:56:28.577 に答える
1

この問題には 2 つのアプローチがあります。

  • この条件がサイトを変更する場合 (StackOverflow の通知のように、上部に表示されます)、使用を妨げない場合は、プレゼンテーション ロジックで解決する必要があると思います (したがって、ビューでは、実際のビューがない場合テンプレートを美化しただけです)。

    この場合のセッション変数は、モデル レイヤーの状態の一部にすぎません。ビュー インスタンスがモデル レイヤーからデータを要求すると、ユーザーに新しい通知があることが通知されます。これは、各ビューがこの通知の表現を現在の応答に追加する機能を持つことを意味します。できれば、出力を組み立てるときに 1 つの追加のテンプレートを使用することを選択します。この機能はすべてのビュー間で共有されるため、単一の変更点を提供する基本クラスに実装できます。

  • この免責事項への同意が全員に義務付けられている場合 (アダルトをテーマにしたサイトで「私は 18 歳以上です」など)、この場合の最善の選択肢は、ユーザーがルーティング メカニズムで条件に同意したかどうかを確認することです。ASP.NET MVC での要求ルーティングをどの程度制御できるかはわかりませんが、これも単一の変更点として提供されます。

    ルーティング メカニズムで決定が下される場合、それは条件を標準の MVC トライアドから完全に除外することも意味します。

于 2012-08-16T06:52:14.837 に答える