Привязка модели для параметров пустой строки запроса в ASP.NET MVC 2

StackOverflow https://stackoverflow.com/questions/1263563

Вопрос

Поведение описано здесь теперь кажется, что это значение по умолчанию для ASP.NET MVC 2 (по крайней мере, для предварительной версии 1).

При привязке модели к строке запроса следующим образом:

 ?Foo=&Bar=cat 

Происходит следующая привязка (при условии, что вы привязываетесь к модели со строковыми свойствами «Foo» и «Bar»)

АСП.NET MVC 1

 model.Foo = "";
 model.Bar = "cat":

ASP.NET MVC 2 (предварительная версия 1 до версии RC)

 model.Foo = null;
 model.Bar = "cat":

Хотел предупредить всех, кто играет с V2, поскольку об этом не упоминалось в 'гу-ноты'.Также любопытно, может ли кто-нибудь из знающих прокомментировать, будет ли это окончательная реализация или настраиваемая функция?В любом случае со мной все в порядке, но я просто надеюсь, что они не вернутся к старому способу!Быть настраиваемым было бы еще лучше.

Редактировать: Урок, который следует извлечь из этого момента, заключается в том, что для какой бы версии вы ни разрабатывали, не следует писать код, который говорит Foo.Length == 0 для проверки пустой строки или Foo.Length > 3 для проверки минимальной длины.Используйте string.IsNullOrEmpty(Foo) и/или сначала проверьте значение null.


Обновлять: Этот вопрос вызвал у меня любопытство относительно того, почему они на самом деле внесли это изменение.Думаю, я наткнулся на ответ, исследуя отключенные элементы управления.Спецификация HTML W3 определяет 'успешный контроль' следующее :

Успешный контроль является «действительным» для подачи.Каждое успешное управление имеет свое контрольное имя в сочетании с его текущим значением как часть представленного набора данных формы.Успешное управление должно быть определена в элементе формы и должно иметь управляющее имя.

Другими словами, успешный элемент управления — это тот элемент управления, который вернется на сервер в качестве параметра строки запроса.Теперь, если элемент управления не имеет допустимого значения, то в соответствии со спецификацией:

Если элемент управления не имеет текущая стоимость Когда форма отправляется, пользовательские агенты не обязаны рассматривать ее как успешный контроль.

(отметьте здесь формулировку «открыто для интерпретации» рядом с «не требуется...»)

Поэтому я думаю, что отправив нулевое значение вместо пустой строки, вы уменьшите несовместимость браузеров, когда некоторые браузеры могут отправлять Foo=&Bar= а другие могут даже не отправить этот параметр строки запроса.Всегда интерпретируя Foo= как будто Фу вообще не было, заставляет вас занять более оборонительную позицию.

Я думаю, что, по крайней мере, я на правильном пути относительно причины, по которой это происходит, и, по крайней мере, частично это связано с понятием «успешный контроль».

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

Это было полезно?

Решение

Null более точно отражает то, чем он является на самом деле, и он совместим с другими типами, допускающими значение NULL, помимо строки, поэтому я думаю, что это сделано специально.

Другие советы

Я предпочитаю поведение v1.Как вы сможете передать пустую строку в v2?Кроме того, в последнем случае вы не можете определить, находится ли foo в параметрах запроса или нет.

Одним из способов настройки является замена связывателя модели по умолчанию в версии 2 (или версии 1), чтобы обеспечить согласованное поведение.Я сам предпочитаю ноль.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top