質問者
Webユーザーコントロールの生成するHTMLコードを取得する方法はありませんでしょうか?

質問
-
いつもお世話になります。
早速ですが、aaa.aspx ファイル内で帳票データとして
パラメータUserIDをbbb.ascx内にプロパティとして渡して
aaa.aspx内にてwebユーザーコントロールを表示しています。
これらの帳票データをDBに保存する際に各項目を格納するのではなくbbb.ascxが受け取ったパラメータUserIDを元に生成するhtmlコード(実際にクライアントがブラウザで受け取るコードを意味しています)そのものを保存したく試行錯誤していますがなかなかうまくいきません。
まずhttp://www.velocityreviews.com/forums/t96140-send-ascx-files-html-code-as-email.html
を参考にascxをコントロールとして呼び出そうと以下のようにしてみましたが
Dim c As Control = Me.bbb1 (bbb.ascx のIDです)
Dim Sw As New System.IO.StringWriter()
Dim Writer As HtmlTextWriter = New HtmlTextWriter(Sw)
Dim Contents As String = ""
Try
c.RenderControl(Writer)
Contents = Sw.GetStringBuilder().ToString()
Finally
Sw.Close()
Writer.Close()
End Try、bbb.ascx内のgridviewが<form runat="server></form>内にありません
というえらーでダメでした。
(当然ですがbbb.ascxないには<from>タグは存在しません)
次にaaa.aspxでbbb.ascx表示直後にbbb1のプロパティを探ってみましたが表示HTMLコードに関する情報は見当たりませんでした。唯一、innerHTMLの項目があったのですがこの値は無効になっていました。最後の方法としてVBあたりでwebBrowserコントロールを持ったアプリを作ってサーバー上で実際にアクセスしその生成されたコードを取得しようかと思ったのですが別アプリに頼る動作は信頼性の部分で劣るのであまりやりたくはありません。
以上のような状況ですが、このようにユーザーコントロールの生成タグを取得、またはもうひとつの方法として仮想的にbbb.aspxというbbb.ascxと類似のページそのものを作成し、その吐き出すタグそのものを取得するような方法は存在するでしょうか?
ご教示のほどよろしくお願いいたします。
すべての返信
-
-
早速のご返信ありがとうございます。
1日考えた末に、コントロール側ではどうも無理っぽいので以下の方法をとってみました。
http://www.codeproject.com/aspnet/serveriframe.asp
これを参考に、
1 ASCX内のhtml タグを<DIV id='IwantThisCode'></div>でかこむ
2 ページ本体に<input type="hidden" name="PrefeCode" value="">を配置
3 JAVAで document.aspnetForm.PreferCode.value=Document.getElementById("IwantThisCode").innerHTMLを実行
で、ポストバック時にRequest.Form("PreferCode")に格納してひっぱって見ました
一応うまくいってます。難点は取得の為に一度ポストバックが必須になるのですが
まあ、仕方ないということで・・・・
-
あれ?
http://vsug.jp/tabid/63/forumid/47/postid/3056/view/topic/tpage/2/Default.aspx
こちらにあるように VerifyRenderingInServerForm メソッドと EnableEventValidation プロパティをオーバーライドしてやると例外を出さずに RenderControl できるようになりませんか?
-
Keith K N さんからの引用 以上のような状況ですが、このようにユーザーコントロールの生成タグを取得、またはもうひとつの方法として仮想的にbbb.aspxというbbb.ascxと類似のページそのものを作成し、その吐き出すタグそのものを取得するような方法は存在するでしょうか?
本当に bbb.aspx を作成するなら、
StringWriter output = new StringWriter();HttpRuntime.ProcessRequest(new SimpleWorkerRequest("bbb.aspx", "UserID=test", output));// TextBox1 に結果を出力this.TextBox1.Text = output.ToString();
とかでよさそうですけど。