この記事は、『基礎からのASP.NET』
目時秀典・鈴木和久 著/ソフトバンククリエイティブ
を教科書にして、C#で勉強していこうというものです。
本を持ってなくてもわかるようにしようとは思っていますが~
いまチャプター8を攻略中です。
はい、ページ間のデータ受渡しも3回目になります。
今回はちょっと楽できそうですかね^^;
やりたいことは前々回(7)と同じですので、
SendData1.aspx (画面にHTMLのTextBoxとDropDownList、標準のButtonを配置)
GetData1.aspx (画面に標準のLabelを2個配置)
通常のHTMLタグにちょっと手を加えると、前回(8)と似た方法で値の取得が
できるとのことです。
まず送信側の画面を見てみましょう。
最初に、Input(Text)コントロール。
<input id="Text1" type="text" name="Text1"/>
name属性を付けることで、値取得時の識別子にするんでしたね。
これを、
<input id="Text1" type="text" runat="server"/>
のようにします。
name="Text1"は不要です。
ツールボックスのHTMLカテゴリからドロップした後、「runat="server"」
を追加しただけです。
どうも本の説明では、「サーバーコントロールとして実行」という
コンテキストメニューが出てくるようになってるんですが、
VWD2008ではでてこないっぽいですね??
ちょっと調べてみますが、今回は気にせず行きます。
次に、Selectコントロール。
<select id="Select1" name="fruit">
の部分を
<select id="Select1" name="fruit" runat="server">
とするだけです。残りのオプション部分は(7)回のソースと同じです。
<option value="Apple">りんご</option>
<option selected="" value="Orange">みかん</option>
<option value="bana">バナナ</option>
</select>
こちらも、「runat="server"」を足しただけですね。
こうすると、データを受け取る時はどう変わるんでしょうか?
ポイントだけ前回の記述と比較しましょう。
<前回のWebサーバコントロールの値を取得する方法>
TextBox Tmp_TextBox = (TextBox)Page.PreviousPage.FindControl("TextBox1");
if (Tmp_TextBox != null)
{
Label1.Text = Tmp_TextBox.Text;
}
DropDownList Tmp_DropDownList = (DropDownList)Page.PreviousPage.FindControl("DropDownList1");
if (Tmp_DropDownList != null)
{
Label2.Text = Tmp_DropDownList.SelectedValue;
}
<今回のHTMLサーバコントロールの値を取得する方法>
HtmlInputText Tmp_InputText = (HtmlInputText)Page.PreviousPage.FindControl("Text1");
if (Tmp_InputText != null)
{
Label1.Text = Tmp_InputText.Value;
}
HtmlSelect Tmp_HtmlSelect = (HtmlSelect)Page.PreviousPage.FindControl("Select1");
if (Tmp_HtmlSelect != null)
{
Label2.Text = Tmp_HtmlSelect.Value;
}
キャストする型が変わりました。Html~型になります。
コントロールの識別には、name属性ではなく、id属性(Text1、Select1)を使います。
(idはプロパティと呼べなくもなさそうですが、<asp:~>タグではないので
HTMLと同じく属性という表現にしておきます)
取得するプロパティがValueに変わっています。
さて、今まで出てきた3種類の方法をまとめておきます。
Webページ上に表示する入力部品には3種類あります。
■一般的なHTML
[画面の記述方法]
HTMLタグそのもの(ツールボックスのHTMLカテゴリからドロップ)
[入力された値の取得方法]
Page.Request.Form("HTMLタグのname属性")
■Webサーバコントロール
[画面の記述方法]
<asp:~> </asp:~>(ツールボックスの標準カテゴリからドロップ)
[入力された値の取得方法]
Page.PreviousPage.FindControl("asp:~タグのIDプロパティ")
→ただし、対応するSystem.Web.UI.WebControls のクラスに
キャストして使用する。
送信側の画面上でクラスとして認識されているのと同じ型が、
上記メソッドによって得られる。
■HTMLサーバコントロール
[画面の記述方法]
HTMLタグの属性に、runat="server" を追加
[入力された値の取得方法]
Page.PreviousPage.FindControl("HTMLタグのid属性")
→ただし、対応するSystem.Web.UI.HtmlControls のクラスに
キャストして使用する
HTMLと同等の記述をしていながら、それがクラスとして表現された型が
上記メソッドによって得られる。
本によると、この3つの方法が「POSTメソッドの処理」として
紹介されているんですが・・・。
腑に落ちない・・・><;
というのも、「GETメソッドの処理」の段になって始めて、
formタグのmethodに"get"を設定する説明がでてくるんです。
つまり今まではformタグにはmethod=は記述してないんです。
formタグのmethodはデフォルトが"get"であると、
手持ちの『プチリファレンスHTML』やいくつかのWeb上のHTMLリファレンスで
確認できました。
<参考>
TAG<index>
http://www.tagindex.com/html_tag/form/form_action.html
え!?
じゃぁいままでのはpostではなくgetで動いてたんじゃ??
試しに今回まとめた3つの方法全てで、formタグに
method="get" もしくは method="post"
を明示して試してみました。
(methodの記述がない場合は、3つとも動作を確認しています)
すると、一般的なHTMLだけは、
method="get" →NG表示されず
method="post" →OK表示できた!
となりました。
なるほど、ここは明示してなければ"post"となってるようです。
Webサーバコントロール、およびHTMLサーバコントロールは、
どちらでも表示ができました!!
これまた微妙な結果です^^;
サーバコントロールはmethodに依存しないんでしょうか?
とはいえ、どちらでも問題ないという方がメンドウがなくて良い
と考えることもできますね。
関係するかわかりませんが、
VWD2008のデフォルトで出力されるformタグは、
<form id="form1" runat="server">
のように、runat="server" が付与されてるんですねー。
てことは、このform自体がサーバーコントロール?
この記述を外そうとすると、
<asp:~>タグがform内にある場合と、runat="server" 付きのコントロールが
ある場合にはエラーになるようです。
ん~どうも迷走してしまいますね。
まぁそういうモノだと思っておきますか・・・。
ちなみに、methodoに「get」を使うか、「post」を使うかは、
上記参考サイトの他、以下のサイトが参考になりました。
<参考>
The Web KANZAKI
http://www.kanzaki.com/docs/html/htminfo32.html#method-choice
今回はここまでにしておきます。
次回は「getメソッド」を使う方法です。
この記事にコメントする

(0)