3

これは長いタイトルです。これが私が行っていることです。レポートパラメーターがURLに表示されないようにするために、コードビハインドのボタンクリックハンドラーでこれを実行して、レポートを表示します。

System.Web.HttpContext.Current.Response.Clear();
System.Web.HttpContext.Current.Response.Write("<html><head></head>");    
System.Web.HttpContext.Current.Response.Write("<body onload=\"document.mainform.submit(); \">");
System.Web.HttpContext.Current.Response.Write(string.Format(CultureInfo.InvariantCulture, "<form name=\"mainform\" method=\"post\" action=\"{0}\">", ReportURL));
foreach (string key in Params.Keys)
{
    System.Web.HttpContext.Current.Response.Write(string.Format(CultureInfo.InvariantCulture, "<input name=\"{0}\" type=\"hidden\" value=\"{1}\">", key, Params[key]));
}
System.Web.HttpContext.Current.Response.Write("</form>");
System.Web.HttpContext.Current.Response.Write("</body></html>");

これはうまく機能しますが、レポートから戻ると、生成したばかりのページに移動します。このページは、onloadイベントのためにフォームをすぐに送信します。私はそれを通り越すために本当に素早く2回反撃することができますが、これは理想的ではありません。

HTMLを作成する前にClientScript.RegisterStartupScriptを使用してJavaScriptで新しいウィンドウを開こうとしましたが、新しいウィンドウのHttpContextを取得する方法(または可能かどうか)がわかりません。

4

2 に答える 2

0

結局、新しいウィンドウを開くことになりました。2つの小さなJavaScript関数を追加しました

function openNewWin() {
    $('form').attr('target', '_blank');
    setTimeout('resetFormTarget()', 500);
}

function resetFormTarget() {
    $('form').attr('target', '');
}

次に、リンクボタンで設定しました

OnClientClick="openNewWin();"

OnClickは引き続きサーバー側の上のコードを実行しますが、応答は新しいウィンドウに書き込まれます。openNewWin関数のsetTimeoutは、フォームのターゲットプロパティをリセットするため、アプリはフォームに戻った後も正常に機能します。

于 2012-06-15T00:22:01.020 に答える
0

コードを使用して問題を再現できなかったため、より多くのコンテキストが役立つ可能性があります。ページの残りの部分がどのように構成されているかによっては、クリックハンドラーの代わりにPostbackURLを使用できる場合があります。

<form id="form1" runat="server">
    <asp:HiddenField runat="server" ID="Key1" Value="Value1"/>
    <asp:HiddenField runat="server" ID="Key2" Value="Value2"/>
    <asp:Button runat="server" ID="button"
        Text="ok" PostBackUrl="ReportURL.aspx"/>
</form>

このように、ブラウザの履歴で余分な/置き換えられたページについて心配する必要はありません。

于 2012-04-06T18:29:51.687 に答える