2

おそらく私が見逃した単純な見落としです(Response.Writeの内部動作がいくつかの状況で期待どおりに機能しないことについてのあいまいなブログ投稿を漠然と思い出しますが、これがそれらの1つであるかどうかは覚えていません):

状況は、SP2010 で実行されているコントロールにリンク ボタンがあり、HttpContext.Response.Write() を使用しない場合、すべてが期待どおりに機能します (つまり、ラベルの .Text 値を変更できます)。ただし、Context.Response.Write() を呼び出すと、コードをデバッグしてステップ実行できますが、何も起こらないように見えます (何も書き戻されず、他のコントロールへの変更は表示されません)。_layouts のアプリケーション ページで実行され、モーダル ダイアログに表示されます。

(基本的に、私はこれをやろうとしています - http://acveer.wordpress.com/2011/01/25/using-the-sharepoint-2010-modal-dialog/しかし、うまくいきません。編集:私がasp:Button に変更しても、まだ機能しません)

興味がある場合は、次のコードをご覧ください。

.aspx:

@ Page Language="C#" AutoEventWireup="true" ... 
<asp:LinkButton CssClass="button remove" runat="server" OnClick="remove_Click" Text="Remove" ID="remove"></asp:LinkButton>

.aspx.cs:

    public void remove_Click(object sender, EventArgs e)
    {
        ....

        //if successful
        HttpContext context = HttpContext.Current;
        if (HttpContext.Current.Request.QueryString["IsDlg"] != null)
        {
            testControl.Text = "test code";

            //doesn't work, and prevents line above from working
            Context.Response.Write("<script type='text/javascript'>alert('hi!');</script>");
            Context.Response.Flush();
            Context.Response.End();

           // context.Response.Write("<script type='text/javascript'>window.frameElement.commitPopup()</script>");
           // context.Response.Flush();
           // context.Response.End();
        }           
    }

似たようなものに出くわした人はいますか?

編集:役立つかもしれないいくつかの興味深い部分、

  • ボタン自体は UpdatePanel 内にあります
  • AsyncPostbackTrigger が割り当てられています
4

3 に答える 3

3

@Ruben は非常に良い回答を提供してくれましたが、コメントに収まらない有用なコンテンツを追加できると感じました。

SharePoint では、Response.Write を使用する場合がいくつかあります。つまり、SharePoint Modal ポップアップ内に表示される Web パーツを処理し、window.frameElement.commitPopup().

更新パネル内で Response.Write を使用しているという事実は、実際には問題の一部です。更新パネルで生成されたポストバックが返されると、更新パネルに関連付けられた div と divの新しい内部 HTML で応答UpdatePanelId|Response Contentがフォーマットされます。response.write を使用すると、その形式が失われるため、ScriptManager は応答を処理する方法がわからず、エラーとして無視する必要があります。@Ruben は、UpdatePanel 内にスクリプトを登録する方法を提供しました。UpdatePanelIdResponse Content

于 2012-08-08T15:15:12.533 に答える
3

Web フォームのコード ビハインドから Response.Write を使用することは、よくても問題があります。経験則として、Web フォーム ページまたはユーザー コントロールから Response.Write を使用しないでください。

Response.Write が問題となる理由は、それがページのコントロール ツリーおよびレンダリング インフラストラクチャの一部ではないためです。これは、イベント内で使用すると、通常のページ フローの外、通常は適切な HTML ページ構造の外にテキストを出力することを意味します。

これが、UpdatePanels と組み合わせて使用​​するとうまくいかない理由でもあります。UpdatePanels はページの一部を置き換えるように特別に設計されているため、インフラストラクチャはどの部分を認識する必要があります。Response.Write は完全にこれの外部で発生し、それをレンダリングする場所を知る実際の方法はありません。せいぜい、ScriptManager は Response.Clear を実行して Response.Writes を一掃します。最悪の場合、UpdatePanel プロトコル本体が壊れて、JavaScript エラーが発生します。

さらに、サーバーから送信された HTML フラグメントを埋めるために使用されるブラウザーの機能はタグを実行しないため<script>、部分的なページ更新を実行している場合、リテラルタグはすべて無視されます。innerHTML<script>

さて、このすべての理論が邪魔にならなくなったので、UpdatePanel を介して JavaScript コードの一部を実行する方法はありませんか? Response.Write: ScriptManager.RegisterClientScriptBlockおよびScriptManager.RegisterStartupScriptを実行するよりもはるかにクリーンです。例えば:

ScriptManager.RegisterClientScriptBlock(
    theButton, // control or UpdatePanel that will be rendered
    typeof(YourPage), "UniqueKey", // makes your script uniquely identifiable
    "alert('Testing!');", true);

重要な部分は最初の引数です。これで、ScriptManager はいつスクリプトを実行するかを知ることができます。部分的なページの更新で更新されないコントロールに登録すると、スクリプトは実行されません。ただし、コントロールを含む UpdatePanel更新されると、それに接続されているスクリプトも実行されます。そして、それは通常、まさにあなたが望むものです。

どのパネルが更新されるかに関係なく、常にスクリプトを実行したい場合は、次のように呼び出します。

ScriptManager.RegisterClientScriptBlock(Page, ... );
于 2012-08-08T15:05:47.623 に答える
2

Context.Response...には小文字のコンテキストが必要です

すなわち:

context.Response.Flush()

または私はポイントを逃していますか?

于 2012-08-08T13:53:59.520 に答える