17

ここで説明する動作は、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 がまったく存在しないかのように解釈することで、より防御的になります。

ここでの理由については、少なくとも正しい軌道に乗っていると思います-そして、少なくとも部分的には「成功したコントロール」の概念と関係があります。

http://www.w3.org/TR/html401/interact/forms.html#h-17.13.2

4

3 に答える 3

4

Nullは実際の状態をよりよく表しており、文字列以外の他のnull許容型と互換性があるため、仕様によるものだと思います。

于 2009-08-12T02:09:43.170 に答える
4

v1 の動作の方が好きです。v2 で空の文字列を渡すにはどうすればよいですか? さらに、後者では、 foo がクエリパラメーターに含まれているかどうかを判断できません。

于 2009-08-13T12:02:32.707 に答える
0

構成する 1 つの方法は、V2 (または V1) の既定のモデル バインダーを置き換えて、一貫した動作を取得することです。私自身、ヌルの方が好きです。

于 2009-08-12T18:11:07.353 に答える