0

ViewState の実験を始めました。使用したい理由は、ユーザーが正常にログインしたときに、ユーザー名の値を Web ページ (Web フォーム プロジェクト) に追加するためです。

ログイン後に名前を割り当て、ログインに成功するとユーザーを Default.aspx にリダイレクトします。

ViewState.Add("UserFirstName", name);
Response.Redirect("Default.aspx");

デフォルトのページが読み込まれると、値を取得して Site.Master のラベルに割り当てようとします。

ただし、値は null です。

userName = ViewState["UserFirstName"].ToString();
        SiteMaster master = (SiteMaster)Page.Master;
        master.labelInfo = "<strong>Welcome</strong> " + userName;

非常に無知で経験の浅い私に出くわしたら申し訳ありませんが、クエリ文字列やセッション変数を使用せずにこのユーザー名の値を維持するための最良の解決策は何ですか?

4

3 に答える 3

3

ViewState は、同じページ内にいる場合にのみ維持されます。そのため、別のページにリダイレクトすると値が NULL になります。ViewState は、ページ内の base-64 でエンコードされた隠しフィールドに保持されます。あなたがやろうとしていることについてはSession、より良い選択でしょう:

Session["Username"]=name;
Response.Redirect("Default.aspx");

そして、Default.aspx

string name = Session["Username"];
于 2013-06-10T16:03:28.290 に答える
1

他の人が述べたように、ViewState は HiddenField に埋め込まれたエンコードされたデータを通じて維持されます。ページを離れると、明らかに HiddenField は使用できなくなります。

セッション変数に対する嫌悪感は共有しますが、セッションはこれを行うための最良の方法です。TempData と呼ばれる、実装する必要がありますが、使用できる MVC の概念があります。アイデアは基本的に、Session に保持されているディクショナリをラップすることです。これにより、すべての読み取りがそのエントリを消去するようにマークされるか、すべてのページの読み込みが TempData ディクショナリ全体を強制終了します。

Session は本質的にスコープ外に出ることのないコンテンツを持つグローバル変数であるため、TempData のようなソリューションは、あるページから次のページに情報を転送するのに適しています。

于 2013-06-10T16:11:52.230 に答える
1

セッション変数を明示的に使用したくないため (これが実際にこれを行うための最良の方法です)、他の唯一のオプションは、ユーザーがログインしてユーザーの名前を保存するときに Cookie を設定し、その Cookie を読み取ることです。後続の各ページで - もちろん、これはセッション状態を使用する場合と大差ありません (その価値があるため、安全性ははるかに低くなります)。

于 2013-06-10T16:04:33.653 に答える