ASP.NETの落とし穴

SNSの"Mixi"の日記の出来事なので載せるかどうか悩んだのですが、クローズにしておくのにはあまりに勿体無い情報なので、もし落とし穴にハマリそうに為った人達の役に立てればと思い紹介します。

先日私のサイトのTipsとしてページ遷移時に値も遷移させると言う物を作っていました。
ボタン1をクリックした時、クエリ文字列に値を持たせて同一ページにアクセスし、ボタン2クリック時にクエリ文字列の値をテキストに表示させる。こういうシンプルな物でした。


私の持っていた勘違い知識として、クエリ文字列を持った状態で、意図的に値を変更し、ボタン2を押した時、テキストボックスには変更した値ををそのまま表示すると思っていました。(大間違いです。)



よくよくソースを見てみるとで持っていたのでそこから参照してるんだろうなぁと思いました。


以上のような書き込みをした時、id:aspxさんから

Googleホームページを表示させて
アドレスをヤフーに変更して
Google検索するとどこに飛びますか?

と言うコメントを頂きました。


onoさんからは

formのactionに書いてあるんだったら、それを見るだろね。
ボタンをクリックしたときはIEのアドレスに書いてあるURLはまったく参照しないから。
ちなみに、アドレスに書いてあるURLにアクセスするときはGET、formタグからアクセスするときはPOSTというHTTPのメソッドが利用される。だから「POST」Backだったりする。

・ナオキ君の場合、ボタンを押したときにformタグからPOSTによるアクセスが行われること知らなかった。これは、HTTPに関する理解が足りなかったということ。

と言うコメントを頂きました。


私のしていた勘違いはお二人のコメントのお陰で正されました。ポストバックされた時

タグ内にactionとしてURLが記述されているので、ブラウザ上に表示されてるurlを上書き修正しても、上書き修正したURLにアクセスをしない限り、ボタン等の他のイベントからポストバックを行われてもクエリ文字列は利用される事がない。修正したURLにアクセスした後だとそのクエリ文字列を利用する事ができる。


これで上の問題は解消されたのですが、実は私は一番最初の勘違いをしている時点でASP.NETの落とし穴にはまりかけていました。

上のような事を起こしてしまった原因をしょーぢさんは次のようにコメントしてくださいました。

> ・ナオキ君の場合、ボタンを押したときにformタグからPOSTによるアクセスが行われること知らなかった。これは、HTTPに関する理解が足りなかったということ。

これはHTMLの標準仕様に対するブラウザの実装の話かと。
一般的には、formエレメントのmethodアトリビュートにpostとあった場合、ブラウザはhttpのpostでリクエストを発行する。
methodアトリビュートにgetとあればgetで送信。
ASP.NETの場合、PostBackなのでpostじゃなきゃイヤンというわけで。

続いてASP.NETの落とし穴に関してコメントを頂きました。

ASP.NETが出るちょっと前『クライアントサイドとサーバサイドの技術的実装をちゃんと知らずに使われると大変な事になるよねぇ』みたいな話を色々な人としてました。
そして今その危惧が現実に(・∀・)!

このあたりのキーワードは押さえておいた方が良いと思われ。

○クライアント側
・DHTMLの技術的可能範囲
・httpの基本的な仕様
・標準的なHTMLの記述に対するブラウザの挙動

○サーバ側
・COM+(コンポーネントサービス、アプリケーションプール)とIISの関係
・何がどのプロセスでどういうセキュリティコンテキストで動くか
・どんな技術がどんなプロトコルを受け入れるのか

MCPの315/320に繋がる内容でもあるんですけどね(´ー`)


このコメントを良く見てみると、私はしょーぢさんが言う押させておいた方が良いキーワードに関して全く解っていなかったと言うことです。
激しくヤバイです。今焦ってHTTPの基本仕様やDHTMLの技術的可能範囲等、クライアント側の技術的な実装を調べているのですが、これがまた奥が深いです。今後blogでちょこちょこあげていくことになりそうです。


もしASP.NETを勉強している方で上のキーワードのどれかが解らなかったら是非調べて落とし穴にハマらないように気をつけて下さい!


コメントを下さった3人はMSMVPと言う超凄腕技術者の方々なのでアドバイスもそれぞれ的確にかつ、丁寧に教えてくださいました。本当にありがとうございます。おかげさまで何とか落とし穴に完璧に落ちる前に対応策等を見つける事が出来そうです('∇')