0

私は、ユーザーがサイトに入る前にユーザーの選択を知る必要があるシステムに取り組んでいます。これまで、選択肢はCookieに保存され、ページの読み込み時にJavaScriptによってチェックされていました。Cookieが存在しない場合は、ダイアログが表示され、ユーザーが選択を行います。

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

これにより問題が発生したため(ほとんどの場合、Cookieをクリアすることで修正されます)、データベースに選択肢を保存するように切り替えています。必要なのは、すべてのページ(MVCおよびWebフォーム)が選択が行われたことを確認し、選択が行われていない場合は、ダイアログを表示するか、選択できるページにリダイレクトするための適切な方法です。

私を悩ませている主なことは、MVCを使用してリダイレクトを発生させるには、を返す必要があることRedirectResultです。これは、アクションからのみ実行できます。私はすべてのアクションにこのチェックに関するコードを持たせたくありません-それはベースコントローラーから可能であるはずの種類のことのようです(ベースページがを引き起こす可能性があるのと同じようにResponse.Redirect

すべてのページがデータベースのチェックを実行し、リダイレクトを発生させるか、ダイアログを表示するための良い方法を誰かが提案できますか?

4

1 に答える 1

2

私を悩ませている主なことは、MVCを使用してリダイレクトを発生させるには、RedirectResultを返す必要があることです。これは、アクションからのみ実行できます。

まったく違います。カスタムアクションフィルターからリダイレクトすることもできます。

たとえばIAuthorizationFilter、ユーザーが必要な選択をしたかどうかをチェックし、そうでない場合は特定のページにリダイレクトするカスタムを作成できます。チェックは、Cookie、データベース、またはこの情報を保持することにした場所に対して実行できます。

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();
    }
}

今、あなたはさまざまな可能性を持っています:

  • このチェックを実行するコントローラー/アクションを[EnsureChoiceHasBeenMade]属性で装飾します
  • アクションフィルターをグローバルアクションフィルターとして登録して、絶対にすべてのアクションに適用されるようにします
  • いくつかの動的な値に基づいていくつかのアクションにアクションフィルターを動的に適用するために、カスタムフィルタープロバイダーを作成します(HttpContextにアクセスできます)。
于 2012-05-09T16:43:57.213 に答える