Acabei de perceber que Html.CheckBox("foo")
gera 2 entradas em vez de uma, alguém sabe por que isso acontece?
<input id="foo" name="foo" type="checkbox" value="true" />
<input name="foo" type="hidden" value="false" />
asp.net-mvc
Omu
fonte
fonte
Respostas:
Se a caixa de seleção não estiver selecionada, o campo do formulário não será enviado. É por isso que sempre há um valor falso no campo oculto. Se você deixar a caixa de seleção desmarcada, o formulário ainda terá valor do campo oculto. É assim que o ASP.NET MVC lida com os valores das caixas de seleção.
Se você quiser confirmar isso, marque a caixa de seleção não com Html.Hidden, mas com
<input type="checkbox" name="MyTestCheckboxValue"></input>
. Deixe a caixa de seleção desmarcada, envie o formulário e observe os valores de solicitação publicados no lado do servidor. Você verá que não há valor na caixa de seleção. Se você tivesse um campo oculto, ele conteriaMyTestCheckboxValue
entrada comfalse
valor.fonte
IsActive
, que é iniciadatrue
no construtor. O usuário desmarca a caixa de seleção, mas como o valor não é enviado ao servidor, o fichário do modelo não a seleciona e o valor da propriedade não é alterado. O fichário do modelo não deve assumir que, se o valor não for enviado, ele foi definido como falso, pois pode ser sua decisão de não enviar esse valor.false
valor mesmo se estiverem marcadas e isso é confuso. As caixas de seleção desabilitadas não devem enviar nenhum valor, se o ASP.NET quiser ser compatível com o comportamento HTTP padrão.Você pode escrever um auxiliar para evitar adicionar a entrada oculta:
use-o:
fonte
@using Your.Name.Space
das dúvidas ... Se o seu ajudante estiver em um espaço para nome, não se esqueça de adicionar no topo do seu arquivo de visualização .cshtml.System.Web.Mvc.Html
para ser acessível em todos os pontos de vistaquando a caixa de seleção estiver marcada e enviada, execute-o
Referir
fonte
A abordagem manual é esta:
fonte
Esta é a versão fortemente tipada da solução de Alexander Trofimov:
fonte
Use Contém, ele funcionará com os dois possíveis valores de postagem: "false" ou "true, false".
fonte
A entrada oculta estava causando problemas nas caixas de seleção com estilo. Então, criei uma extensão auxiliar de HTML para colocar a entrada oculta fora da div que contém a caixa de seleção.
Resultado
fonte
Isso não é um bug! Acrescenta a possibilidade de sempre ter um valor, depois de postar o formulário no servidor. Se você quiser lidar com os campos de entrada da caixa de seleção com jQuery, use o método prop (passe a propriedade 'marcada' como parâmetro). Exemplo:
$('#id').prop('checked')
fonte
Você pode tentar inicializar o construtor do seu modelo assim:
e na sua opinião:
fonte
Descobri que isso realmente causava problemas quando eu tinha um WebGrid. Os links de classificação no WebGrid girariam pela string de consulta dobrada ou x = true & x = false em x = true, false e causariam um erro de análise na caixa de seleção.
Acabei usando o jQuery para excluir os campos ocultos no lado do cliente:
fonte