0

pageX.aspxpageY.aspxの 2 つのページが あるとします。これらのページは、ブラウザーの上部にあるマスター ページを使用します。ユーザーは、サイトの言語を変更するためのいくつかのオプションを利用できます。これらの言語の選択はイメージ ボタン (国のフラグ) の形式ですが、PostbackUrl プロパティは使用しません。代わりに、イベント ハンドラーを使用するだけです。そのような画像ハンドラの 1 つ:

protected void imgbtnEnglish_Click(object sender, ImageClickEventArgs e)
{
    HttpCookie aCookie = new HttpCookie("language");
    aCookie.Value = "en-US";
    aCookie.Expires = DateTime.Now.AddDays(365);
    Response.Cookies.Add(aCookie);

    Response.Redirect(Request.RawUrl);
}

pageX.aspxには、プロパティを持つ画像ボタンが含まれていますPostbackUrl="pageY.aspx"。この画像ボタンの唯一の目的は、pageY.aspxに移動することです。

その画像ボタンが押されると、予想どおり、pageY.aspxに移動します。

ここに謎があります。ブラウザで BACK (コントロールでも何でもなく、古き良き戻るボタン) を押すと、pageX.aspxに戻ります。上部のページは、私がまだpageY.aspxにいると考えています! 画面上のpageX.aspxに戻ったとしても、上部のフラグのいずれかをクリックすると、pageY.aspxに戻るからです。

私が論理的に推測できる唯一のことは、何らかの理由で、それは PostbackUrl であり、サーバーにフォームを送信するため、「戻る」ことは、ページ全体ではなく、送信されたフォームに対してローカルでのみ認識されるということです (マスター ページ)。したがって、「戻る」ことによって、実際にはフォームとマスターページではなく、フォームのみで「戻る」だけです。

問題を解決するために私がしたことは、pageY.aspx に移動するイメージ ボタンをPostbackUrlではなく、1 行の Click イベント ハンドラーにすることです: Response.Redirect("pageY.aspx"); これを行うと、うまく機能します。

これが発生する理由と、PostbackUrl プロパティを使用する代わりに Click イベント ハンドラー ソリューションがベスト プラクティス/適切なソリューションであるかどうかを理解したいと思います。

4

2 に答える 2

1

戻るボタンが押されると、ブラウザは最新のフォームデータとともにキャッシュからページを復元します。たとえば、テキストボックスは入力された値を保持します。ただし、Operaは少し賢くなり、JavaScriptの最新の状態も復元しようとします。

PostBackUrlを設定すると、ボタンがクリックされたときに、JavaScriptを使用してフォームのアクションが変更され、フォームがこの新しいURLに投稿されます。したがって、Operaを押し戻すと、JavaScriptがフォームアクションに変更された状態でページが復元されます。つまり、以降のすべての送信はこの新しいURLに送信されます。

PostBackUrlはJavaScriptが有効になっている場合にのみ機能するため、私はPostBackUrlを使用するのが好きではありません。Response.Redirectサーバー側とHyperlinksクライアント側を使用する方が優れたソリューションです。

于 2012-06-15T14:37:14.370 に答える
0

PostbackUrl と NavigateUrl

基本的に NavigateURL では、POST を実行しています。Response.Redirect は GET を実行します。なぜその特定の動作が見られるのかは完全にはわかりませんが、ブラウザが原因である可能性が非常に高いです. どのブラウザを使用していますか? 他にどのブラウザを試しましたか?

これを行う最善の方法については、ASP.NET コントロールを忘れて、次のようにする方がよいと思います。

<a href="pageY.aspx"><img src="foo.png" /></a>
于 2012-06-15T08:29:47.223 に答える