質問

動作 ここで説明されています 現在、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":

これについては「」で言及されていなかったため、V2 でプレイしている人に注意を促したいと思いました。ぐーノート'。また、これが最終的な実装になるのか、それとも構成可能な機能になるのかについて、詳しい人がコメントできるかどうかも知りたいですか?私はどちらでも大丈夫ですが、彼らが以前のやり方に戻らないことを祈ります。設定可能であればさらに良いでしょう。

編集: この時点から学ぶべき教訓は、開発対象のバージョンが何であれ、空の文字列をテストするために Foo.Length == 0 を指定したり、最小長を確認するために Foo.Length > 3 を指定したりするコードを書かないことです。string.IsNullOrEmpty(Foo) を使用するか、最初に null をチェックします。


アップデート: この疑問は、なぜ彼らが実際にこの変更を行うのかという好奇心を引き起こしました。無効なコントロールについて調べているときに答えに行き当たったと思います。W3 HTML 仕様では、「成功した制御' 次のように :

コントロールの成功は、提出のために「有効」です。すべての成功したコントロールのコントロール名は、提出されたフォームデータセットの一部として現在の値とペアになっています。成功したコントロールは、フォーム要素内で定義する必要があり、コントロール名が必要です。

言い換えれば、成功したコントロールとは、クエリ文字列パラメータとしてサーバーに返されるコントロールです。ここで、コントロールに有効な値がない場合は、仕様に従って次のようになります。

コントロールに 現在の価値 フォームが送信された場合、ユーザーエージェントはそれを成功したコントロールとして扱う必要はありません。

(ここで「...する必要はない」という「自由に解釈できる」文言を見つけてください)

したがって、空の文字列の代わりにnullを送信することで、特定のブラウザが送信する可能性のあるブラウザの非互換性が軽減されると思います Foo=&Bar= また、そのクエリ文字列パラメータを送信しない場合もあります。常に解釈することで Foo= まるでフーがそこにまったくいなかったかのように、より防御的になる必要があります。

ここでの理由については、少なくとも私は正しい方向に進んでいると思います。そして、少なくとも部分的には、「成功したコントロール」という概念と関係があると思います。

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

役に立ちましたか?

解決

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

他のヒント

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top