4

マイページに送信ボタン(サーバー側ボタン)があります。

クリックイベントのコードは次のとおりです。

protected void SubmitButton_Click(object sender, EventArgs e)
{
    db.SaveSomething();
    Page.ClientScript.RegisterStartupScript("someScriptWhichReliesOnServerData");
    Response.Redirect("SomeOtherPage.aspx");
}

さて、問題は、を使用して JavaScript を登録することですがPage.ClientScript.RegisterStartupScript、ポストバック (スクリプトが実行される場所) でページが再レンダリングされないため、代わりに aResponse.Redirectが発生するため、これは効果がありません。

私が考えることができる唯一の解決策は、QueryString、HttpContext.Current.Items、または(gulp)Sessionなど、JavaScriptを実行しようとしていることを「認識」するようにリダイレクトするページを作成することです。

  • QueryString - 実行しようとしている JavaScript であるため、オプションではありません。
  • HttpContext.Current.Items - Response.Redirect を実行しているため、これもオプションではありません (これにより、要求レベルのデータが失われます。これは、URL 書き換えではうまくいかないため、Server.Transfer も使用できません)。
  • セッション - もちろん、理想的ではありません。

他のアイデア/提案はありますか?

明確化のための編集:

実行中の JavaScript は、ユーザーのウォールに公開するための Facebook クライアント側 API の呼び出しです。クライアント側で行う必要があります。「タイトル」、「メッセージ」、「アクション リンク」などをスクリプトに渡します。基本的には JSON の束です。ただし、ここで重要なのは、このデータがポストバックで作成されるため、クライアント側のクリックでこの関数を実行することはできません。

したがって、私が達成しようとしているのは、送信ボタンのクリック、JavaScriptの実行、およびリダイレクトの実行です(この順序である必要はありません。両方が発生する必要があります)。

4

3 に答える 3

5

あなたが経験しているのは、ここでの 2 つの異なるパラダイムの不運な衝突だと思います。一方には利用したい AJAX スタイルの API があり、他方には ASP.Net ページ ポストバック モデルがあります。

これら 2 つは相互に排他的ではありませんが、いくつかの課題が生じる可能性があります。あなたの最善の策は、AJAX アプローチの逆ではなく、もう少し曲げることであるというダンの意見に同意します。

ASP.Net の優れた機能は、ページ内の単一の静的メソッドを疑似 Web サービスに変換できることです。その後、ScriptManager を使用してクライアント側プロキシ クラスを生成し、そのメソッドを呼び出すことができますが、任意のクライアント側ライブラリを使用できます。

非常に簡単な例:

コードビハインドでページ

[WebMethod]
public static Person GetPerson(Int32 id, String lastName)
{
    return DataAccess.GetPerson(id, lastName);
}

ASP.Net AJAX ライブラリを使用してこれを処理していた場合は、ページ メソッドを有効にしてクライアント側プロキシを生成する必要があります。

<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true">
</asp:ScriptManager>

次に、クライアント側のスクリプトから次のように呼び出すことができます。

function CallGetPerson() 
{
     var id = $get("txtPersonId").value;
     var lastName = $get("txtLastName").value;
     // PageMethods is a class that is part of the ASP.Net AJAX
     // client-side libraries and will contain your auto-generated
     // proxy methods for making XHR requests.
     PageMethods.GetPerson(id, lastName, OnGetPersonComplete);
}

function OnGetPersonComplete(result)
{
    faceBookApi.DoSomeStuffWithJson(result);
    window.location = "NewPage.aspx";
}

繰り返しますが、これは不自然な例であり、サーバーに投稿しているものは非常に複雑かもしれませんが、組み込みのフレームワーク コンポーネントを使用して何が達成できるかについての一般的なアイデアを得ることができます。

これが役立つことを願っています。

于 2010-08-25T03:09:26.017 に答える
2

を使用するResponse.Redirectと、前の行で登録した Java スクリプトは実行されません。送信ボタンをクリックした後にやりたいことは次のとおりだと思います。

  1. 何かを保存する
  2. JavaScript を実行する
  3. 別のページにリダイレクト

ここで使用できます:

protected void SubmitButton_Click(object sender, EventArgs e)
{
    db.SaveSomething();
    Page.ClientScript.RegisterStartupScript("someScriptWhichReliesOnServerData");
    Page.ClientScript.RegisterStartupScript("window.location.href=XXXXXX");
}

つまり、 の代わりに JavaScript を使用してページをリダイレクトしますResponse.Redirect

于 2010-08-25T02:19:12.047 に答える
0

2 ページ目で JavaScript を実行していただけますか?

それ以外は、オプションが多少制限されています。AJAX を使用して、必要なデータをサーバーから取得し、リダイレクトすることができます。少なくとも中間の JavaScript を実行するために余分なページの読み込みが発生しないため、これにより UX が改善されます。


別のオプションは を使用することServer.Transfer(...)です。これは と同様に機能Response.Redirectしますが、クライアントにリダイレクト ヘッダーを送信しません。サーバーに「現在のページの実行を停止し、新しいページの実行を開始する」ように指示するだけです。Context.Itemsリクエストのコンテキスト全体ではなく、リクエストに応答する責任のみを転送しているため、2 つのクラス間のスコープに残ります。


これら 2 つのソリューションを組み合わせることもできます。スコープ内の値を保持し、最初のページから保持した値を使用して 2 番目のページに JS をレンダリングするために使用しServer.Transferます。Context.Items

于 2010-08-25T02:38:27.933 に答える