- PR -

[ASP.net]動的にHTMLを出力する方法

1
投稿者投稿内容
なんとか
会議室デビュー日: 2006/09/27
投稿数: 17
投稿日時: 2006-09-27 10:16
はじめまして。なんとかと申します。

今回ASP.NETで開発する事となりました。
ASPでの開発経験はあるのですが、ASP.NETは初めてです。

そこで質問があります。
ASP.NETでは動的に作成したHTML文をaspx内に出力する事は可能でしょうか?
可能であるならばどのように実現すれば良いでしょうか?

例)
<BODY>
<asp:Label ID="Label1" runat="server" Text="------">

★★★

<asp:RadioButton ID="RadioButton1" runat="server" Text="実行" />
<table>


</table>
</BODY>

『★★★』の部分をOnLoad時に
・テンプレートファイルを読込み、編集等を行ったりしたHTMLを出力したい。
・そこにはさまざまなパターンでテーブルだったり、ボタンだったりと表示を行いたい。
・考えうるオブジェクトを全てはりつけて表示、非表示での制御は行いたくない。
・同時に『★★★』の上にあるラベルもOnLoad時に処理を行いたい

環境:
WinXP SP2
VS2005

以上 どなたか御教授お願いします。

かめたろ
ぬし
会議室デビュー日: 2003/03/20
投稿数: 255
投稿日時: 2006-09-27 10:36
可能ですよ。
Page.Controls に子コントロールを追加していくやり方で。

引用:

Page クラス
ASP.NET Web アプリケーションのホストであるサーバーから要求された .aspx ファイルを表します。



追記------------------------------------------------------------------
カスタムコントロールを作ったときの感想なんですが、
作り方が悪かったんだろうけど、ビューステートの復元とかがしんどかった
想像力に乏しいので、実行するまでデザインが見えないのがつらかった
あと、デザインをちょろっと直したいだけなのに、ビルドしなきゃならない

なんかネガティブな意見ばっかりでスミマセン。

ちなみに、SQL Server のレポーティングサービスのレポートマネージャを見てみると、aspxの中にはページディレクティブしか書かれていないですね。

[ メッセージ編集済み 編集者: かめたろ 編集日時 2006-09-27 10:57 ]
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2006-09-27 11:02
単に★の場所にHTMLを出力したいだけなら、Literalコントロールを使えばいいと思います。
Literal.Textプロパティに"<INPUT TYPE="TEXT">"とか書けばテキストボックスが出力されます。
でも、おそらくそういうことではなくて、★の場所に<asp:TextBox>とかを設定して、それをさらにサーバー側で解釈(つまりテキストボックスコントロールが動的に作成される)したいんですよね?
無理だと思います。
引用:

かめたろさんの書き込み (2006-09-27 10:36) より:
Page.Controls に子コントロールを追加していくやり方で。


Page.Controlsに追加しても、次の要求を受けた時にはコントロールが無いわけで、値やイベントが取れなくないですか?

使うコントロールを事前に張っておくのがいやになるくらい色々な表示状態があるなら、ページ分けてください。
その方が (作る時間が)はやい、(人件費が)やすい、(ソースの書き方が)うまい になると思います。

なんとかさんのやりたいことは満足できないでしょうが、動的なコントロールの追加の方法を参考までに紹介しておきます。Framework2.0では別のやり方があるかもしれませんが。
http://support.microsoft.com/default.aspx?scid=kb;ja;317794
コントロールのIDと同じ名前の変数の宣言が必要みたいですね。
どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2006-09-27 11:08
ASP.NETの場合、動的にHTMLを作成する、と考えるより、動的にコントロールのツリーを
構築する、と考えたほうがいいかもしれません。

やり方としては、
・デザイン時にPlaceHolderを置いておき、実行時にその中にコントロールを組み込んでいく
・MultiViewを作成しておいて、Viewの表示/非表示でコントロールする
・マスターページを使う
といった方法が考えられるかな。

ブラウザからあがってくるデータの処理とかASPとはまたまったく違った感じに
なりますから、最初にしっかり悩んでおかないと、ASP.NETの利点がほとんど
いかせないASP風プログラムになってしまう可能性があると思います。
まずはいろいろさわってみたほうがいいんじゃないかなぁ。
なんとか
会議室デビュー日: 2006/09/27
投稿数: 17
投稿日時: 2006-09-27 11:34
早速の御回答ありがとうございます。

早速いろいろ試してみました。
【page.Controls】を使う:
Page.Controls.Add(New LiteralControl("<table><tr><td>AAA</td><tr></table>"))
→HTMLの一番最後(ブラウザの一番下)に表示されてしましました。
 ★★★の位置へ表示するという指定方法が現在わからない状態です。

【Literal】コントロールを使う
Literal1.Text = "<table><tr><td>AAA</td><tr></table>"
→★★★の位置にコントロールを貼り付け、期待通りに表示されました。
 ボタンですが一郎さんのおっしゃるとおり「<asp:TextBox>」は無理でしたが
 Literal2.Text = "<input type=""Button"" value=""次へ"" onClick=""JavaScipt:location.href='./02.aspx'"" />"
 ↑こんな感じで対応しようと思います。

基本的にはASPとは違いコントロールを操作しようと思いますが、今回はできるなら一部的に動的に表示したかったので、質問ささていただきました。

page.Controlsについてはもう少し調べてみようと思います。(指定した場所に表示できるよう)

ありがとうございました。
かめたろ
ぬし
会議室デビュー日: 2003/03/20
投稿数: 255
投稿日時: 2006-09-27 12:02
引用:

一郎さんの書き込み (2006-09-27 11:02) より:
Page.Controlsに追加しても、次の要求を受けた時にはコントロールが無いわけで、値やイベントが取れなくないですか?


可能だってことが伝わればいいかなって思ったんで・・・
イベントを拾うためには、もちろんイベントハンドラを登録する必要があります。

フォームのコントロールを使う場合、Page.Controlsには、まずHtmlFormを追加して(2.0だとPage.Formプロパティがあるみたい)、そのControlsの中に子コントロールを追加しないとならないですね。

できるとかって言っちゃった以上、責任を感じているので一応サンプルです。

テキストボックスとボタンとラベルがあり、ボタンを押すとテキストボックスの内容がラベルに表示されます。
コード:

Protected WithEvents f As HtmlForm
Protected WithEvents t As TextBox
Protected WithEvents b As Button
Protected WithEvents l As Label

Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init
f = New HtmlForm
Page.Controls.Add(f)
t = New TextBox
f.Controls.Add(t)
b = New Button
b.Text = "押して"
f.Controls.Add(b)
l = New Label
f.Controls.Add(l)
AddHandler b.Click, AddressOf b_Click
End Sub

Private Sub b_Click(ByVal sender As Object, ByVal e As EventArgs)
l.Text = t.Text
End Sub

aspxにはページディレクティブだけ。



ブラウザでソース表示してみるとHTMLとして不完全です。この辺も整えていかないとならないです。また、コントロールを動的に変更する場合、レンダー時とポストバック時にコントロールのツリーが異なっているとまずかったりって場合もあるので。

すんごい手間がかかりますよー

#ふぅ、必死になっちった。でも私、なんか趣旨とずれてますね。申し訳ない。

[ メッセージ編集済み 編集者: かめたろ 編集日時 2006-09-27 12:07 ]
どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2006-09-27 12:30
Pageそのものにコントロールを追加した場合、aspxで定義されているすべての
コントロールの最後に追加されます。
htmlタグなんかはaspxファイルがコードに変換される際にリテラルコントロールに
変換されますので、これらもaspxで定義されているコントロールに含まれます。

なので、前に書いてますがPlaceHolderを使ってください。
PlaceHolderはそのために存在しています。
まぁ、一郎さんが言うようにイベント等を受けようとしたらいろいろと考えないと
いけないことがでてきますけどね。
なんとか
会議室デビュー日: 2006/09/27
投稿数: 17
投稿日時: 2006-09-27 13:09
いろいろの実現方法があり、メリット、デメリットがあるのですね。

page.Controlsで指定した場所にコントロールを追加する事はまだ調査中ですが、
みなさんのおかげで、考えていた事が実現できそうです。

ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)