3

ユーザーコントロールを次のように動的にレンダリングしています。

public string RenderControl(string pathcontrol)
{
    string html;

    var page = new Page();
    var control = page.LoadControl(path);            
    page.Controls.Add(control);

    // do stuff to the control (give it some data to work on)

    using (var writer = new StringWriter())
    {
        HttpContext.Current.Server.Execute(page, writer, false);
        html = writer.ToString();
    }

    return html;
}

これにより、通常のページのレンダリング時に、ajax呼び出しへの応答をレンダリングするときと同じユーザーコントロールが可能になります。ただし、それ自体にscriptmanagerProxyを含むコントロールを追加すると、新しく作成されたPageオブジェクトにScriptManagerまたはScriptManagerを実行する必要のあるHtmlFormが含まれていないという問題が発生します。

これを回避する方法はありますか?

あなたのアンドレアス

4

3 に答える 3

4

他の人が言っているように、ScriptMangerを動的に簡単に追加できます[ ScriptManagerをページにプログラムで追加しますか?Pageオブジェクトが完成した場合。

代わりに、 BuildManager.CreateInstanceFromVirtualPath()を使用してPageオブジェクトを作成してみてください。問題は、そのオブジェクトをどのように作成するかということかもしれません。新しいページを作成することには、Pageオブジェクトを新しくすることよりも少し多くのことがあります。

例えば。

Page page 
       = BuildManager.CreateInstanceFromVirtualPath("~/Test.aspx", typeof(Page))

もう少し背景については、http://www.west-wind.com/weblog/posts/120530.aspxも参照してください。

于 2010-05-01T18:55:36.060 に答える
1

次のようなことができますか:

page.Form.Controls.AddAt(0, New ScriptManager())

編集:ページ自体だけでなく、ページのフォームにもコントロールを追加する必要があると思いますよね?フォームがページで作成されることは私の理解ですが、そうでない場合は、次のことができるはずです:

page.Form = new HtmlForm()

次のようなことも必要になる場合があります。

page.Controls.Add(page.Form)
于 2010-04-13T15:53:37.197 に答える
0

確かに、トリックはページの Init イベント ハンドラーに追加することです。以下を使用できます。

Page.Init += delegate {

  // check for script manager
  if( ScriptManager.GetCurrent(Page) == null ) {

    ScriptManager m = new ScriptManager();
    m.ScriptMode = ScriptMode.Release;
    Page.Form.Controls.AddAt(0, m);

  }

}

可能であれば、フォームをページに動的に追加することは避けることをお勧めします。たとえば、上記のコード スニペットは、フォームがページに既に存在することを前提としています。

アップデート

確かに、それを指摘してくれてありがとうアンドレアス。これが更新です。そのため、Page.Form のセッターはありませんが、Controls コレクションに新しい HtmlForm を追加できるという点で正しいです。追加すると、Page.Form プロパティは null ではなくなります。これにより、上記のように ScriptManager を動的に追加できます。この動作を示すコード サンプルを次に示します (ASPX ファイルは、サーバー サイド フォームのない単純なページです)。

public partial class Pages_Test_DynamicFormSample : Page {

    protected void Page_Init(object sender, EventArgs e) {

        Controls.Add( new HtmlForm() );

        ScriptManager m = new ScriptManager();
        m.ScriptMode = ScriptMode.Release;
        Form.Controls.AddAt(0, m);

    }

    protected void Page_Load(object sender, EventArgs e) {

        // ScriptManager test
        var t1 = new System.Web.UI.WebControls.TextBox();
        var t2 = new System.Web.UI.WebControls.TextBox();
        Form.Controls.Add( t1 );
        Form.Controls.Add( t2 );

        ScriptManager.GetCurrent(Page).SetFocus( t2 );

    }

}

お楽しみください - ちなみに、ScriptManager の ScriptMode を Release に設定する必要はありません。これは、ASP.NET スクリプト ランタイムのデバッグ バージョンで見つかった JavaScript のバグを回避するためだけに行っています。

于 2010-05-01T04:06:01.920 に答える