1

以前は完全な .aspx ページにあった既存の一連のコードを取得し、.ashx ハンドラーで同じことを実行しようとしています。

このコードは、HtmlTable オブジェクトを作成し、それらの行に行とセルを追加してから、その html テーブルを .aspx のコントロール コレクションに追加し、それを既にページにあった div に追加しました。

私はコードを無傷に保とうとしていますが、コントロールを div に入れる代わりに、実際に html を生成し、AJAX クライアント側を介して呼び出すことができるテキストの大きなチャンクでそれを返します。

InnerHtml プロパティを使用しようとすると HtmlTable でエラーが発生し (サポートされていないと表示されます)、RenderControl を試すと、最初に TextWriter オブジェクトを作成し、次に HtmlTextWriter オブジェクトを作成すると、Page を null にできないというエラーが表示されます。

誰もこれを以前にやったことがありますか?助言がありますか?

4

2 に答える 2

2

*最新のものは上記です。

OK、マットの更新後でも回避策があります;)

formまず、内部のあるページを使用する必要があります。ScriptManagerそうしないと、コントロールを追加できません。もう1つ、ScriptManagerコントロールはフォームの最初のコントロールである必要があります。さらに簡単です:

Page page = new Page();
Button button = new System.Web.UI.WebControls.Button
{
    ID = "btnSumbit",
    Text = "TextButton",
    UseSubmitBehavior = true
};
HtmlForm form = new HtmlForm
{
    ID="theForm"
};
ScriptManager scriptManager = new ScriptManager
{
    ID = "ajaxScriptManager"
};
form.Controls.Add(scriptManager);
form.Controls.Add(button);
page.Controls.Add(form);

using (StringWriter output = new StringWriter())
{
    HttpContext.Current.Server.Execute(page, output, false);

    context.Response.ContentType = "text/plain";
    context.Response.Write(output.ToString());
}

これは機能します。出力はかなり大きいので、答えに含めないことにしました:)


実際には、回避策があります。はい、ハンドラーでコントロールをレンダリングする場合があります。

まず、フォームのないページが必要です。それがないと、次のようになります。

タイプ「ボタン」のコントロール「btnSumbit」は、runat=serverのフォームタグ内に配置する必要があります。

public class FormlessPage : Page
{
    public override void VerifyRenderingInServerForm(Control control)
    {
    }
}

FormlessPage第二に、誰も私たちが私たちのページのインスタンスを作成するのを防ぐことはできません。次に、そこにコントロールを追加しましょう(例としてコントロールを追加することにしましたButtonが、任意のコントロールを使用できます)。

FormlessPage page = new FormlessPage();
Button button = new System.Web.UI.WebControls.Button
{
    ID = "btnSumbit",
    Text = "TextButton",
    UseSubmitBehavior = true
};
page.Controls.Add(button);

第三に、出力をキャプチャしましょう。このために、次のHttpServerUtility.Execute方法を使用します。

現在のリクエストのコンテキストで、指定された仮想パスのハンドラーを実行します。System.IO.TextWriter実行されたハンドラーからの出力をキャプチャし、ブールパラメーターでコレクションとコレクションをクリアするかどうかを指定 し System.Web.HttpRequest.QueryStringます System.Web.HttpRequest.Form

コードは次のとおりです。

using (StringWriter output = new StringWriter())
{
    HttpContext.Current.Server.Execute(page, output, false);

    context.Response.ContentType = "text/plain";
    context.Response.Write(output.ToString());
}

結果は次のようになります。

<input type="submit" name="btnSumbit" value="TextButton" id="btnSumbit" />

さらに、ScottGuの記事「ヒント/トリック:UpdatePanel以外のシナリオでASP.NETAJAXで使用するクールなUIテンプレート手法」をお勧めします。そこにたくさんの便利なものが見つかることを願っています。

于 2010-04-28T19:36:21.683 に答える
1

もう 1 つのオプションは、プロセスで ASP.NET HTTP パイプラインをホストし、ページをストリームにレンダリングし、ページの処理後に HttpListenerContext.Response.OutputStream ストリームから送信する必要がある HTML を読み取ることです。

この記事に詳細があります: http://msdn.microsoft.com/en-us/magazine/cc163879.aspx

于 2010-04-28T19:05:11.250 に答える