こんにちはtsuttieです(*'▽')
aspxのページにformタグを一つ以上置けないわけを考えましたので備忘録として残します。
#1. 注意
あくまで「そうじゃないかな・・・」という予想なので、間違えているかもしれません。
もっと多くの理由があるかもしれません。もし、ご指摘がありましたらコメントいただけると幸いです。
#2. 2つ以上のタグを置くと・・・
2つ以上のformタグを設定すると、IDは違っても以下のエラーが出力されます。
<head runat="server">
<title>あああ</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<p><input type="file" name="test" id="test" runat="server" /></p>
<p><asp:Button ID="Button" runat="server" Text="send" OnClick="Button_Click"/></p>
</div>
</form>
<form id="form2" runat="server">
<div>
<p><input type="file" name="test" id="test2" runat="server" /></p>
<p><asp:Button ID="Button2" runat="server" Text="send" OnClick="Button2_Click"/></p>
</div>
</form>
</body>
1 つのページには、1 つのサーバー側 Form タグのみを指定できます。
OH…まぁ一応知っていたのですが。。。
何故なのだろう。とここで疑問。
とりあえずformを一つ消してリクエストボディを確認してみました。
#3 リクエストボディの中身
上記を参考にリクエストボディを取り出し、中を確認したところ・・・
中身はmultipart/form-dataになっており、
-----------------------------7e3373050c34
Content-Disposition: form-data; name="__VIEWSTATE"
hogehoge
-----------------------------7e3373050c34
Content-Disposition: form-data; name="__VIEWSTATEGENERATOR"
fugafuga
-----------------------------7e3373050c34
Content-Disposition: form-data; name="__EVENTVALIDATION"
uhouho
-----------------------------7e3373050c34
Content-Disposition: form-data; name="fileup"; filename="test.txt"
Content-Type: text/plain
あああああああああ
-----------------------------7e3373050c34
Content-Disposition: form-data; name="Button"
send
-----------------------------7e3373050c34--
name="__VIEWSTATEGENERATOR"
とかname="__EVENTVALIDATION"
とかが入っていました。(もちろんアップしたファイルデータも)
開発者ツールからDOMを確認すると
<div class="aspNetHidden"><input name="__VIEWSTATE" id="__VIEWSTATE" type="hidden" value="なかみ"></div>
見慣れないhiddenフィールドが・・・
あ~。ビューステートですか。
ページの状態保持やらセキュリティ保護のためにページ生成のタイミングでhidden値を作成。
それを使って内容を保持っている感じでしょうか。
そのためformタグを2つ以上使われると
サーバーに送りたい内容が送れなくなる危険性があるから
formタグは1つ縛りなのか・・・
ついでにpostのリクエストボディはmultipart/form-dataっぽい。
#4 まとめ
あっているかはわかりませんが、
色々中身を見るいい機会になりました。
何かご指摘等ありましたら、コメントいただければ幸いです。
よろしくお願いします。('◇')ゞ