2012-05-09 12 views
0

サイトに入る前にユーザーの選択を知る必要があるシステムで作業しています。これまでは選択肢がクッキーに保存されており、ページの読み込み時にJavaScriptによってチェックされていました。クッキーが存在しない場合、ダイアログが表示され、ユーザーが選択します。MVCとWebフォームのページを表示する前に選択を強制する

通常、ユーザーはアプリケーションのホームページにアクセスすることを期待していますが、アプリケーション内の任意のページのURLに合法的に従うことができるため、選択を確認するJavaScriptはすべてのページに存在します。

これは問題を引き起こしています(ほとんどの場合、クッキーを消去することによって問題が解決しました)ので、選択肢をデータベースに保存するように切り替えています。私たちに必要なのは、すべてのページ(MVCとWebフォーム)が選択されたことを確認し、そうでなければダイアログを表示するか、または選択ができるページにリダイレクトするかのようなきちんとした方法です。

MVCを使用してリダイレクトを行うには、RedirectResultを返す必要があります。これはアクションからのみ行うことができます。私はすべてのアクションがこのチェックに関するコードを持っていることを望んでいません - ベースコントローラーから可能でなければならないもののようです(基本ページがResponse.Redirectの場合と同じように)。

すべてのページがデータベース上でチェックを実行し、その後、リダイレクトが発生したり、ダイアログを表示するのいずれかするための良い方法はありますか?

答えて

2

私を悩ま主なものは、MVCを使用してリダイレクトを引き起こすために、私はRedirectResultを返す必要が ということですこれは、 アクションからのみ行うことができます。

全くありません。カスタムaction filtersからリダイレクトすることもできます。

たとえば、ユーザーが必要な選択を行ったかどうか、特定のページにリダイレクトしないかどうかを確認するカスタムIAuthorizationFilterを書くことができます。チェックは、クッキー、データベースまたはどこあなたがこの情報を保持することを決定に対して行うことができる:あなたはこれを実行するコントローラ/アクションを飾る

  • public class EnsureChoiceHasBeenMadeAttribute : FilterAttribute, IAuthorizationFilter 
    { 
        public void OnAuthorization(AuthorizationContext filterContext) 
        { 
         // get the current user 
         var user = filterContext.HttpContext.User; 
         if (user.Identity.IsAuthenticated && !UserMadeAChoice(user.Identity.Name)) 
         { 
          // if the current user is authenticated and he didn't made a choice 
          // redirect him to some page without even attempting to execute 
          // the controller action that he requested 
          var values = new RouteValueDictionary(new 
          { 
           controller = "home", 
           action = "index" 
          }); 
          filterContext.Result = new RedirectToRouteResult(values); 
         } 
        } 
    
        private bool UserMadeAChoice(string username) 
        { 
         throw new NotImplementedException(); 
        } 
    } 
    

    は今、あなたは異なる可能性がありますそれは絶対にすべてのアクション

  • あなたはDYNAするために custom filter providerを書くために適用されるよう [EnsureChoiceHasBeenMade]属性に確認することは
  • あなたはglobal action filterとしてアクションフィルタを登録しますダイナミックな値(HttpContextにアクセスできる)に基づいてアクションフィルタをいくつかのアクションに適用します。
関連する問題