Meu modelo tem um booleano que deve ser anulável
public bool? Foo
{
get;
set;
}
então no meu Razor cshtml eu tenho
@Html.CheckBoxFor(m => m.Foo)
exceto que não funciona. Nem a conversão com (bool). Se eu fizer
@Html.CheckBoxFor(m => m.Foo.Value)
isso não cria um erro, mas não liga ao meu modelo quando postado e foo é definido como nulo. Qual é a melhor maneira de exibir Foo na página e vinculá-lo ao meu modelo em uma postagem?
asp.net-mvc-3
razor
nullable
DMulligan
fonte
fonte
Respostas:
Eu tenho que trabalhar com
e então fazendo um Boolean.cshtml na minha pasta EditorTemplates e colando
dentro.
fonte
HasValue
propriedade anulável , mas não o valor booleano real. Isso criará uma caixa de seleção marcada, independentemente do valor subjacente. Se o valor anulável tiver um valor, ele sempre será verdadeiro.Resposta encontrada em pergunta semelhante - Rendering Nullable Bool as CheckBox . É muito simples e funciona:
É como uma resposta aceita de @afinkelstein, exceto que não precisamos de um 'modelo de editor' especial
fonte
Eu tenho
bool? IsDisabled { get; set; }
no modelo. Inserido se estiver em Visualização.fonte
Por quê? Isso não faz sentido. Uma caixa de seleção tem dois estados: marcada / desmarcada ou Verdadeiro / Falso, se preferir. Não existe um terceiro estado.
Ou espere, você está usando seus modelos de domínio em suas visualizações em vez de modelos de visualização? Esse é o seu problema. Portanto, a solução para mim é usar um modelo de visualização no qual você definirá uma propriedade booleana simples:
e agora você terá a ação do controlador passando este modelo de visualização para a visualização e gerar a caixa de seleção apropriada.
fonte
Não é recomendado complicar uma primitiva com campos ocultos para esclarecer se False ou Null.
A caixa de seleção não é o que você deve usar - na verdade, ela só tem um estado: marcada . Caso contrário, pode ser qualquer coisa.
Quando o campo do seu banco de dados é um booleano anulável (
bool?
), o UX deve usar 3-Radio Buttons, onde o primeiro botão representa seu "Checked", o segundo botão representa "Not Checked" e o terceiro botão representa seu null, qualquer que seja a semântica de significa nulo. Você poderia usar uma<select><option>
lista suspensa para salvar o imóvel, mas o usuário precisa clicar duas vezes e as opções não são tão claras instantaneamente.O RadioButtonList, definido como uma extensão chamada RadioButtonForSelectList, cria os botões de opção para você, incluindo o valor selecionado / marcado, e define o
<div class="RBxxxx">
para que você possa usar css para fazer seus botões de opção ficarem na horizontal (display: bloco em linha), vertical ou em estilo de tabela (exibição: bloco embutido; largura: 100px;)No modelo (estou usando string, string para a definição do dicionário como um exemplo pedagógico. Você pode usar bool ?, string)
fonte
Para mim, a solução foi mudar o modelo de visualização. Considere que você está procurando faturas. Essas faturas podem ser pagas ou não. Portanto, sua pesquisa tem três opções: Pago, Não Pago ou "Não me importo".
Eu tinha definido originalmente como um bool? campo:
Isso me fez tropeçar nessa questão. Acabei criando um tipo Enum e lidei com isso da seguinte maneira:
Claro que eu os embrulhei em rótulos e especificou o texto, só quero dizer aqui está outra opção a ser considerada.
fonte
A caixa de seleção oferece apenas 2 valores (verdadeiro, falso). O booleano anulável tem 3 valores (verdadeiro, falso, nulo), então é impossível fazer isso com uma caixa de seleção.
Uma boa opção é usar um menu suspenso.
Modelo
Controlador
Visão
fonte
Na verdade, eu criaria um modelo para ele e usaria esse modelo com um EditorFor ().
Aqui está como eu fiz:
Create My template, que é basicamente uma visualização parcial que criei no diretório EditorTemplates, em Compartilhado, em Visualizações nomeie como (por exemplo)
CheckboxTemplate
::Use-o assim (em qualquer visualização):
@ Html.EditorFor (x => x.MyNullableBooleanCheckboxToBe, "CheckboxTemplate")
Isso é tudo.
Os modelos são tão poderosos em MVC, use-os .. Você pode criar uma página inteira como um modelo, que você usaria com o
@Html.EditorFor()
; desde que você passe seu modelo de visão na expressão lambda ..fonte
A abordagem mais limpa que eu poderia propor é expandir as extensões disponíveis e,
HtmlHelper
ao mesmo tempo, reutilizar a funcionalidade fornecida pela estrutura.Eu experimentei 'moldar' a expressão para permitir uma passagem direta para o nativo,
CheckBoxFor<Expression<Func<T, bool>>>
mas não acho que seja possível.fonte
public static MvcHtmlString CheckBoxFor<TModel>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, bool?>> expression, object htmlAttributes)
e funcionou maravilhosamente bem.Eu tive um problema semelhante no passado.
Crie uma entrada de caixa de seleção em HTML e defina o nome do atributo = "Foo". Isso ainda deve postar corretamente.
fonte
Basta verificar o valor nulo e retornar falso para ele:
fonte
Eu também enfrentei o mesmo problema. Tentei a seguinte abordagem para resolver o problema porque não quero alterar o banco de dados e gerar novamente o EDMX.
fonte
Ao fazer um EditorTemplate para um modelo que contém um bool anulável ...
Divida o bool anulável em 2 booleanos:
No modelo do editor:
Não poste a propriedade original Foo, porque ela agora é calculada a partir de FooIsNull e FooCheckbox.
fonte
Todas as respostas acima vieram com seus próprios problemas. A maneira mais fácil / limpa da IMO é criar um ajudante
MVC5 Razor
App_Code / Helpers.cshtml
Uso
No meu cenário, uma caixa de seleção anulável significa que um membro da equipe ainda não fez a pergunta ao cliente, então ela está enrolada em um
.checkbox-nullable
para que você possa estilizar apropriadamente e ajudar o usuário final a identificar que não étrue
nemfalse
CSS
fonte
Métodos de extensão:
fonte
Os botões de opção são úteis, mas não permitem que você desmarque . Se você deseja esse comportamento, considere usar um menu suspenso / selecione. O código a seguir irá gerar o
SelectList
e este se vincula a um booleano anulável:fonte
fonte
você pode tentar assim
fonte
Esta é uma pergunta antiga e as respostas existentes descrevem a maioria das alternativas. Mas há uma opção simples, se você tiver bool? em seu viewmodel, e você não se preocupa com null em sua IU:
fonte