mvc bind/post booleano per radiobutton

Ho una colonna nel mio Modello con un NULLABLE valore booleano. Ora il mio punto di Vista (per l’editing, vorrei associare a due radiobutton: Sì & N. Se il valore è null, quindi solo due radiobutton non spuntato. Come posso fare per fare che?

Grazie.

InformationsquelleAutor Xuan Vu | 2010-05-06



4 Replies
  1. 22

    Una volta selezionato un pulsante di opzione, non c’è davvero nessun modo per deselezionarla (come utente). Vorrei suggerire che, se si ha realmente bisogno di una tre valori di risultato, che si hanno tre pulsanti di opzione — Sì, No, non la cura.

    <%= Html.LabelFor( m => m.Foo ) %>
    <%= Html.RadioButtonFor( m => m.Foo, "true" ) %> Yes
    <%= Html.RadioButtonFor( m => m.Foo, "false" ) %> No
    <%= Html.RadioButtonFor( m => m.Foo, string.Empty ) %> Don't Care
    <%= Html.ValidationMessageFor( m => m.Foo ) %>
    • Grazie 🙂 Dimenticato la mia domanda fino ad oggi, Html.RadioButtonFor risolto il problema.
    • Mi si avvicinò con la stessa soluzione, ma in qualche modo se Foo è null il Don't care radio non è selezionata…tutte le idee perché?
    • Non ne sono sicuro. Utilizza la Conversione.ToString() sul modello di proprietà (e il valore). Se il bool? è nulla che dovrebbe convertire string.Empty e il pulsante dovrebbe essere controllato.
    • Yeap. non è così. Ho una condizione che verifica se il valore è null e in tal caso si applica l’html l’attributo checked=”checked” per l’ultimo pulsante di opzione. Non funziona in un altro modo…
    • Anche se questo permetterà la selezione di un nuovo valore, RadioButtonFor() non selezionare valori attuali della variabile associata. È necessario impostare il checked attributo in modo condizionale. A causa di questo non essere accettato risposta. Mi dispiace.
    • Questa soluzione è esattamente quello che mi serviva! stringa.Vuoto è IL modo per passare un valore null per il controller. Ho usato @stringa.Vuoto per chi usa il Rasoio btw

  2. 3

    L’uso di più Html.RadioButtonFor (m => m.Pippo, “true”) sembra generare codice HTML non valido, perché genera controlli con lo stesso Id:

    <input **id="Foo"** ... type="radio" value="True">
    <input **id="Foo"** ... type="radio" value="False">

    Ho risolto il problema rendendo i pulsanti di opzione direttamente in html:

    <input type="radio" name="Foo" value="true" id="Foo_True"
           <%:Html.WriteCheckedIfTrue(Model.Foo.HasValue && Model.Foo.Value)%>/>
           <label for="Foo_True">Yes</label><br/>
    
    <input type="radio" name="Foo" value="false" id="Foo_False" 
           <%:Html.WriteCheckedIfTrue(Model.Foo.HasValue && !Model.Foo.Value)%>/> 
           <label for="Foo_False">No</label><br/>
    
    <input type="radio" name="Foo" value="" id="Foo_Null" 
           <%:Html.WriteCheckedIfTrue(!Model.Foo.HasValue)%>/> 
           <label for="Foo_Null">Don't Care</label>

    assicurarsi di assegnare un nome al pulsante radio a seconda della viewmodel, ad esempio: Modello.Filtro.HasImage nome: Filtro.HasImage a lavorare con il modello di associazione

    Il “html helper” assomiglia a questo:

        public static MvcHtmlString WriteCheckedIfTrue(this HtmlHelper htmlHelper, 
                                                       bool validation)
        {
            if(validation)
                return new MvcHtmlString("checked=\"checked\"");
    
            return new MvcHtmlString(string.Empty);
        }
    • Nota che si può semplicemente ignorare l’ID che gli helper generare.
  3. 3

    Posso imbattuto in questo post in ritardo, ma qui è la mia soluzione, che gestisce l’impostazione dei valori. Questo è utilizzato un modello di Editor. È necessario specificare l’Editor modello nome. Ho chiamato il mio ‘NullableBool’

    @model bool?
    
    @{
    
    Layout = null;
    
    IDictionary<string, object> yesAttributes = new Dictionary<string, object>();
    IDictionary<string, object> noAttributes = new Dictionary<string, object>();
    IDictionary<string, object> naAttributes = new Dictionary<string, object>();
    
    if (Model.HasValue)
    {
        if (Model.Value)
        {
            yesAttributes.Add("checked", "checked");
        }
        else
        {
            noAttributes.Add("checked", "checked");
        }
    }
    else
    {
        naAttributes.Add("checked", "checked");
    }
    }
    
    @Html.RadioButtonFor(m => m, "true", yesAttributes) Yes`
    
    @Html.RadioButtonFor(m => m, "false", noAttributes) No`
    
    @Html.RadioButtonFor(m => m, string.Empty, naAttributes) N/A`
  4. 1

    Questo è un rasoio soluzione al problema. Questo è un vecchio ASP domanda.

    Il problema è che è necessario impostare il checked attributo perché il Html.RadioButtonFor non controlla un pulsante di opzione basata su un nullable bool (che sembra essere un difetto).

    Anche mettendo i pulsanti di opzione all’interno dell’etichetta, tag, è possibile selezionare il valore cliccando l’etichetta.

    Condivisa/EditorTemplates/Boolean.cshtml

    @model bool?
    <label>
        <span>n/a</span>
        @Html.RadioButtonFor(x => x, "", !Model.HasValue ? new { @checked=true } : null) 
    </label>
    <label>
        <span>Yes</span>
        @Html.RadioButtonFor(x => x, true, Model.GetValueOrDefault() ? new { @checked = true } : null)
    </label>
    <label>
        <span>No</span>
        @Html.RadioButtonFor(x => x, false, Model.HasValue && !Model.Value ? new { @checked = true } : null)
    </label>

Lascia un commento