Estou trabalhando em um aplicativo ASP.NET MVC 4. Este aplicativo possui um formulário básico. O modelo do meu formulário se parece com o seguinte:
public class MyModel
{
public string Name { get; set; }
public bool Remember { get; set; }
}
No meu formulário, tenho o seguinte HTML.
<input id="Name" name="Name" type="text" value="@Model.Name" />
<input id="Remember" name="Remember" type="checkbox" value="@Model.Remember" />
<label for="Remember"> Remember Me?</label>
Quando eu posto o formulário, o valor Lembrar no modelo é sempre falso. No entanto, a propriedade Name no modelo tem um valor. Eu testei isso definindo um ponto de interrupção no seguinte:
[HttpPost]
public ActionResult MyAction(MyModel model)
{
Console.WriteLine(model.Remember.ToString());
}
Eu não consigo entender. Por que o valor Checkbox não está sendo definido?
c#
asp.net-mvc-4
JQuery Mobile
fonte
fonte
Respostas:
Irá gerar:
Como funciona:
checkbox
permanecer desmarcado, o formulário enviará apenas ohidden
valor (falso)true
para abool
propriedade do modelo<input id="Remember" name="Remember" type="checkbox" value="@Model.Remember" />
Isso sempre enviará o valor padrão, se marcado.
fonte
Já que você está usando Model.Name para definir o valor. Suponho que você está passando um modelo de visão vazio para a visão.
Portanto, o valor para Lembrar é falso e define o valor no elemento checkbox como falso. Isso significa que, quando você marca a caixa de seleção, está postando o valor "falso" com o formulário. Quando você não o seleciona, ele não é postado, portanto, o padrão do modelo é falso. É por isso que você está vendo um valor falso em ambos os casos.
O valor só é passado quando você marca a caixa de seleção. Para marcar uma caixa de seleção no Mvc, use
ou se você não deseja vincular o modelo à vista.
O Mvc faz mágica com um campo oculto para persistir os valores quando eles não são selecionados.
Edite, se você realmente tem aversão a fazer isso e deseja gerar o elemento sozinho, você pode fazer.
fonte
@Html.CheckboxFor
código deveria ser@Html.CheckBoxFor
@(Model.Remember ? "checked=\"checked\"" : "")
em um botão de rádio? ou isso não é possíveltype="radio"
, e selecionar o que deseja selecionar no HTML é o mesmo que acimachecked="checked"
,. A diferença é que você terá vários<input />
elementos com o mesmo nome. Você precisa descobrir em qual deles aplicar o HTML extra.@Html.CheckBoxFor(x => x.Remember)
isso funcionou para mimUse apenas este
fonte
$(this).val($(this).is(":checked"));
Ao invés de
usar:
Isso lhe dará uma caixa de seleção específica para Lembrar
fonte
Ok, a caixa de seleção é um pouco estranha. Quando você usa o auxiliar Html, ele gera duas entradas de caixa de seleção na marcação e ambas são passadas como um par nome-valor de IEnumerable se estiver marcado.
Se não estiver marcada na marcação, ela será passada apenas na entrada oculta que possui valor false.
Por exemplo, na marcação você tem:
E na ação do controlador (certifique-se de que o nome corresponda ao nome do parâmetro da caixa de seleção no controlador):
Então, no controlador, você pode fazer algumas coisas como:
Eu sei que esta não é uma solução elegante. Espero que alguém aqui possa dar algumas dicas.
fonte
Para converter um valor retornado de uma caixa de seleção em um formulário em uma propriedade booleana, usei o conversor ValueProviderResult em build em um ModelBinder personalizado.
fonte
Se estiver trabalhando com FormCollection em vez de model, a atribuição pode ser tão simples como:
fonte
Eu encontrei um problema semelhante e consegui obter o valor da caixa de seleção de volta usando uma caixa de seleção, hiddenfor e pouco JQuery assim:
fonte
Isso tem sido uma grande dor e parece que deveria ser mais simples. Aqui está minha configuração e solução.
Estou usando o seguinte auxiliar de HTML:
@Html.CheckBoxFor(model => model.ActiveFlag)
Então, no controlador, estou verificando a coleta de formulários e processando de acordo:
fonte
user.IsActive = fc["IsActive"] != "false";
ainda me sinto sujo por fazer uma comparação de cordas nele.Acabei de encontrar isso (não acredito que não liga / desliga!)
Enfim!
Postará um valor de "on" ou "off".
Isso NÃO vai vincular a um booleano, mas você pode fazer esta solução alternativa boba!
fonte
fonte
Para o MVC usando Model. Modelo:
HTML:
Na função [HttpPost], podemos obter suas propriedades.
fonte
Se você realmente deseja usar HTML simples (por qualquer motivo) e não as extensões HtmlHelper embutidas, você pode fazer isso desta forma.
Ao invés de
tente usar
As entradas da caixa de seleção em HTML funcionam de forma que, quando marcadas, enviam o valor, e quando não são marcadas, não enviam nada (o que fará com que a ASP.NET MVC volte ao valor padrão do campo,
false
). Além disso, o valor da caixa de seleção em HTML pode ser qualquer coisa não apenas verdadeiro / falso, então, se você realmente quiser, pode até usar uma caixa de seleção para um campo de string em seu modelo.Se você usar o embutido
Html.RenderCheckbox
, ele realmente produzirá duas entradas: caixa de seleção e um campo oculto para que um valor falso seja enviado quando a caixa de seleção for desmarcada (não apenas nada). Isso pode causar algumas situações inesperadas, como esta:fonte
Para várias caixas de seleção com o mesmo nome ... Código para remover falso desnecessário:
Função
Use-o :
fonte
fonte
Modificar Lembre-se assim
Use bool anulável no controlador e fallback para falso em nulo como este
fonte
No meu caso, não estava definindo a propriedade de modelo "Lembrar" no método get. Verifique sua lógica no controlador. Você pode estar fazendo o mesmo. Espero esta ajuda!
fonte
Eu li as outras respostas e não estava fazendo funcionar - então aqui está a solução que encontrei.
Meu formulário usa o
Html.EditorFor(e => e.Property)
para gerar a caixa de seleção, e usandoFormCollection
no controlador, isso passa um valor de string'true,false'
no controlador.Quando estou lidando com os resultados, uso um loop para percorrê-los - também uso uma
InfoProperty
instância para representar o valor do modelo atual que está sendo avaliado no formulário.Então, em vez disso, apenas verifico se a string retornada começa com a palavra
'true'
e, em seguida, defino uma variável booleana paratrue
e a passo para o modelo de retorno.fonte