ここで説明する動作は、ASP.NET MVC 2 (少なくともプレビュー 1) の既定のようです。
このようなクエリ文字列をモデルバインドする場合:
?Foo=&Bar=cat
次のバインドが発生します (「Foo」および「Bar」文字列プロパティを持つモデルにバインドしていると仮定します)
ASP.NET MVC 1
model.Foo = "";
model.Bar = "cat":
ASP.NET MVC 2 (RC によるプレビュー 1)
model.Foo = null;
model.Bar = "cat":
これは ' gu-notes 'に記載されていなかったので、V2 で遊んでいる人に注意を促したかったのです。また、これが最終的な実装になるのか、それとも設定可能な機能になるのかについて、知っている人がコメントできるかどうかも知りたいですか? 私はどちらの方法でも大丈夫ですが、彼らが古い方法に戻らないことを願っています! 構成可能であることはさらに良いでしょう。
編集:この時点から学ぶべき教訓は、空の文字列をテストするために Foo.Length == 0 を指定するコード、または最小長をチェックするために Foo.Length > 3 を指定するコードを作成しないことです。string.IsNullOrEmpty(Foo) を使用するか、最初に null をチェックしてください。
更新:この質問は、なぜ彼らが実際にこの変更を行うのかについて、私の好奇心をかき立てました。無効化されたコントロールを研究しているときに、答えに出くわしたと思います。W3 HTML 仕様では、「成功したコントロール」を次のように定義しています。
成功したコントロールは、送信に対して「有効」です。成功したすべてのコントロールには、送信されたフォーム データ セットの一部として、現在の値とペアになっているコントロール名があります。正常なコントロールは FORM 要素内で定義する必要があり、コントロール名が必要です。
つまり、成功したコントロールは、クエリ文字列パラメーターとしてサーバーに返されるコントロールです。ここで、コントロールに有効な値がない場合、仕様に従って:
フォームが送信されたときにコントロールに現在の値 がない場合、ユーザー エージェントはそれを成功したコントロールとして扱う必要はありません。
(ここで「解釈する必要はありません」という言葉を見つけてください)
Foo=&Bar=
したがって、空の文字列の代わりに null を送信することで、特定のブラウザーが送信する可能性があり、他のブラウザーがそのクエリ文字列パラメーターを送信しない可能性があるブラウザーの非互換性を減らすことができると思います。Foo=
常にFoo がまったく存在しないかのように解釈することで、より防御的になります。
ここでの理由については、少なくとも正しい軌道に乗っていると思います-そして、少なくとも部分的には「成功したコントロール」の概念と関係があります。