0

プロジェクトにたくさんのページがあります。私が書くすべてのページで:

if (!IsPostBack)
{     
   if (HttpContext.Current.Session["curUserRole"] == null)
   {
      DBUsers.SetUserStatusOnline("0", ViewState["curUserLogin"].ToString());
      ViewState["curUserLogin"] = "";
      Response.Redirect("~/Login.aspx");
   }
   else
   {       
      ViewState["curUserLogin"] = HttpContext.Current.Session["curUserLogin"].ToString();
      DBUsers.SetUserStatusOnline("1", ViewState["curUserLogin"].ToString());
   }
}

ユーザーがサイトにログインすると、現在のユーザーの役割がセッションに書き込まれ、現在のユーザーのログインがビューステートに書き込まれます。セッションが終了したら、現在のユーザーログインをビューステートで表示し、データベースにオフラインステータスを設定できると思いました。ただし、sessionがnullの場合、ビューステートもnullになります。私に何ができる?

4

3 に答える 3

2

を使用するResponse.redirectと、ページ間でViewStateにアクセスできなくなります。使ってみてくださいServer.transfer

詳細については、 「ページ間でViewStateにアクセス」を確認してください。

于 2012-05-23T13:14:32.167 に答える
1

ロール、ビューステート、およびセッションを手動で処理するよりも、フォーム認証を使用する方が良いアプローチではないでしょうか。

そうすれば、現在のIDと対話して、情報のカスタムストレージではなく、ユーザー情報を取得できます。

また、セッションの有効期限が切れているかどうかを判断するために、ユーザーによるポストバックに依存するべきではないと思います。ユーザーが単にブラウザを閉じるとどうなりますか?彼/彼女は無期限に「オンライン」のままになります。

ユーザーが手動でログアウトするためのメカニズムを提供する必要があります。

これで、セッション状態にInProcを使用している場合、global.asaxでSession_Endを処理して、データベースでそのユーザーを「オフライン」に設定できます。StateServerまたはSQLServerを使用している場合、Session_Endはタイムアウト時に呼び出されないため、ユーザーをオフラインとしてマークするためにDBサーバーでスケジュールされたタスクを使用するなど、カスタムの方法で処理する必要があります。

さて、オンライン/オフラインのステータスを非常に正確に制御する必要がある場合は、より複雑なアプローチをとる必要があるかもしれません。1つのオプションは、ユーザーがアクションを実行するたびに、Userテーブルの最後のアクティビティの日時を保存することです。また、特定の時間にアクティビティを実行しなかったユーザーをオフラインと見なします。別のオプションは、上記の日時を更新するためのキープアライブ呼び出しとして使用されるajax呼び出しです。

于 2012-05-23T17:36:53.507 に答える
0

の答えに加えUnhandledExceptionて、ロジックをクラスに一元化してから、すべてのページにカットアンドペーストするよりも、その新しいクラスからページを派生させる方がよい場合があることも付け加えておきます。

public class MyPageClass : System.Web.UI.Page
{
    protected override void OnLoad(EventArgs e)
    {
        // Add your logic here.

        base.OnLoad(e);
    }
}

public class WebPage1 : MyPageClass
{  
    private void Page_Load(object sender, System.EventArgs e)
    {
    }
}
于 2012-05-23T12:59:20.970 に答える