Pergunta

O comportamento descrita aqui aparecer agora ser o padrão para ASP.NET MVC 2 (pelo menos para Preview 1).

Quando ModelBinding uma querystring assim:

 ?Foo=&Bar=cat 

A seguir, a ligação ocorre (supondo que você está ligação a um modelo com 'Foo' e 'Bar' propriedades de cadeia)

ASP.NET MVC 1

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

ASP.NET MVC 2 (pré-visualização de 1 a RC)

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

Queria dar qualquer um que está jogando com V2 um heads-up uma vez que este não foi mencionado no ' gu-notes '. Também curioso, se alguém que a conhecem posso comentar sobre se ou não este será a implementação final ou uma característica configurável? Estou bem de qualquer maneira, mas só espero que eles não voltar para a velha maneira! Sendo configurável seria ainda melhor.

Editar: A lição a aprender a partir deste ponto é qualquer versão que você está desenvolvendo contra a não escrever código que diz Foo.Length == 0 para teste para uma cadeia vazia ou Foo.Length> 3 para verificar se há um comprimento mínimo. Use string.IsNullOrEmpty (Foo) e / ou seleção para nula em primeiro lugar.


Update: Esta questão provocou a minha curiosidade a respeito de porque eles realmente fazer essa alteração. Eu acho que eu tropecei na resposta ao pesquisar controles deficientes. A W3 HTML especificação define um ' controle bem sucedido ' da seguinte forma:

Um controle bem sucedido é "válido" para submissão. Cada controle bem sucedido tem o seu nome controle emparelhado com o seu valor atual como parte do apresentado formar conjunto de dados. Um controlo bem sucedido deve ser definido dentro de um elemento FORM e deve ter um nome de controlo.

Em outras palavras - um controle bem sucedido é aquele que vai torná-lo de volta para o servidor como um parâmetro de string de consulta. Agora, se um controle não tem um valor válido, em seguida, de acordo com a especificação:

Se um controle não tem uma href="http://www.w3.org/TR/html401/interact/forms.html#current-value" rel="nofollow valor atual quando o formulário é enviado, o usuário agentes não são obrigados a tratá-lo como um controle bem sucedido.

(manchar a linguagem 'aberto à interpretação' aqui com 'não são obrigados a ...')

Então eu acho que através do envio de um nulo em vez de uma cadeia vazia que reduz incompatibilidades navegador onde determinados navegadores podem enviar Foo=&Bar= e outros não podem até mesmo enviar esse parâmetro string de consulta. Por sempre interpretar Foo= como se Foo não estava lá todas as forças que você seja mais defensiva.

Eu acho que estou, pelo menos no caminho certo quanto à razão pela qual aqui - e, pelo menos em parte tem algo a ver com a noção de um 'controle succcessful'.

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

Foi útil?

Solução

Null é mais representativo do que ele realmente é, e é compatível com outros tipos anuláveis ??além de corda, então eu imagino que é por design.

Outras dicas

Eu prefiro o comportamento de v1. Como você vai ser capaz de passar uma string vazia em v2? Além disso, com este último que você não pode dizer se foo está nos parâmetros de consulta ou não.

Uma maneira de configurar seria para substituir o fichário de modelo padrão em V2 (ou V1) para obter um comportamento consistente. Eu prefiro o nulo, eu mesmo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top