Привязка модели для параметров пустой строки запроса в ASP.NET MVC 2
-
13-09-2019 - |
Вопрос
Поведение описано здесь теперь кажется, что это значение по умолчанию для 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=
как будто Фу вообще не было, заставляет вас занять более оборонительную позицию.
Я думаю, что, по крайней мере, я на правильном пути относительно причины, по которой это происходит, и, по крайней мере, частично это связано с понятием «успешный контроль».
Решение
Null более точно отражает то, чем он является на самом деле, и он совместим с другими типами, допускающими значение NULL, помимо строки, поэтому я думаю, что это сделано специально.
Другие советы
Я предпочитаю поведение v1.Как вы сможете передать пустую строку в v2?Кроме того, в последнем случае вы не можете определить, находится ли foo в параметрах запроса или нет.
Одним из способов настройки является замена связывателя модели по умолчанию в версии 2 (или версии 1), чтобы обеспечить согласованное поведение.Я сам предпочитаю ноль.