6

MVCアプリケーションで設定されているセッション変数があります。そのセッションが期限切れになり、ユーザーが現在のページを更新しようとすると、セッションが設定されなくなったため、ページはエラーをスローします。

ビューをロードする前にセッションが設定されているかどうかを確認できる場所はありますか?おそらく、Global.asaxファイル内に何かを入れていますか?

すべてのActionResultの開始時にこのようなことを行うことができます

public ActionResult ViewRecord()
{
    if (MyClass.SessionName == null)
    {
        return View("Home");
    }
    else
    {
        //do something with the session variable
    }
}

これを行う代わりの方法はありますか?この場合のベストプラクティスは何でしょうか?

4

2 に答える 2

5

1 つのコントローラーにある場合は、次のようにできます。

protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
    base.OnActionExecuting(filterContext);
    ... // do your magic
}   

アクションの実行前に発火します。ただし、そこからビューを返すことはできません。アクションの結果を返すものにリダイレクトする必要があります。

filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary { { "controller", "Shared" }, { "action", "Home" } });

ただし、明らかに、オーバーライドの影響を受けないコントローラーのアクションにリダイレクトする必要があります。そうしないと、循環リダイレクトが発生します。:)

于 2012-04-10T14:55:12.093 に答える
0

まず、ホーム ビューを返さずに、ホームにリダイレクトする必要があります。そうしないと、URL が別の場所にあるにもかかわらず、ホーム ページが表示されるという奇妙な状況が発生します。

第 2 に、古いセッションが期限切れになるかリセットされると新しいセッションが作成されるため、Session が Null になることはありません。代わりに変数を確認し、それが null の場合、セッションが新しいことがわかります。

第三に、アプリがこのセッション データに依存している場合は、セッションをまったく使用しません。これを使用してデータをキャッシュしていますか?その場合は、キャッシュを使用することをお勧めします (キャッシュ アイテムの有効期限が切れるとアプリに通知されます)。

残念ながら、これはおそらくThe XY Problemのケースです。問題があり、Session が問題を解決すると信じていますが、Session で別の問題に遭遇しているため、Session が解決しようとしている問題を解決する方法ではなく、セッションの問題を解決する方法を尋ねています。

これで解決しようとしている本当の問題は何ですか?

編集:

以下のコメントに基づいて、URL に顧客番号を渡してはいかがでしょうか。

http://website/Controller/ViewRecord/3

public ActionResult ViewRecord(int id) 
{ 
    // do whatever you need to do with the customer ID
} 
于 2012-04-10T15:46:55.020 に答える