2011-12-13 11 views
7

Sono nuovo da WebForms a MVC. Ho campo di modello di vista con il tipo bool? e, per impostazione predefinita, EditorFor() esegue il rendering di questo campo come DropDownList con l'opzione "Non impostato". Preferirei renderlo come CheckBox e, se il valore è nullo, impostalo su deselezionato.Rendering Nullable Bool come CheckBox

Il nome del campo è RFP.DatesFlexible e così ho scritto il seguente markup a mio avviso:

<input type="checkbox" id="RFP_DatesFlexible" name="RFP.DatesFlexible" /> 
<label for="RFP_DatesFlexible">My Dates are Flexible</label> 

Ma questo non funziona. Il risultato è sempre nullo e ModelState.IsValid è falso.

Qualcuno può dire come potrei fare questo lavoro?

EDIT

Questo è il codice ho finito con, che sembra funzionare bene.

L'etichetta è associata correttamente alla casella di controllo in modo che facendo clic sul testo si alternerà la casella di controllo.

+0

Grazie per la risposta! – resnyanskiy

risposta

5

Qualcosa di simile?

Modelli:

public class MyViewModel 
{ 
    public ViewModel2 RDP { get; set; } 
} 

public class ViewModel2 
{ 
    public bool? DatesFlexible { get; set; } 
} 

Controller:

public ActionResult TestBool() 
    { 
     return View(new MyViewModel { RDP = new ViewModel2() }); 
    } 

    [HttpPost] 
    public ActionResult TestBool(MyViewModel vm) 
    { 
     return View(); 
    } 

Vista:

@model mvc_testing_2.Models.MyViewModel 

@using (Html.BeginForm()) 
{ 
    @Html.CheckBox("RDP.DatesFlexible", 
     Model.RDP.DatesFlexible != null && (bool)Model.RDP.DatesFlexible) 

    <input type="submit" value="go" /> 
} 
+0

Questo non funzionerà. Il primo argomento è un errore perché non può convertire bool? bool. E se lo ho convertito in un bool, ottengo un errore perché non è una proprietà. –

+0

OK, quindi modificalo in questo modo: '@ Html.CheckBox (" DatesFlexible ", Model.DatesFlexible! = Null && (bool) Model.DatesFlexible)'. Funziona, l'ho appena testato. (RFP è una proprietà di un altro modello? Model.RFP.DatesFlexible? Se è così, probabilmente dovrai nominare l'input come lo hai nella tua domanda, non ricordo di averlo in mano) – hawkke

+0

Che compila - grazie . Tuttavia, il campo è ancora 'null' quando la pagina viene inviata. In qualche modo, non sta rilevando che il controllo è associato al campo. (Il campo è Model.RFP.DatesFlexible.) –

1

In primo luogo, penso che aiuterebbe a capire come funziona Html.CheckBox. Non è proprio quello che ti aspetteresti. Date un'occhiata a HTML.CheckBox Behaviour

Per rispondere alla tua domanda, il motivo per il codice non funziona è perché il vostro <input /> richiede un value='true' di legare in modo corretto. Per esempio:

<input type='checkbox' name='RFP.DatesFlexible' value='true' /> 

E aggiungere una proprietà checked='checked' se deve essere controllato.

Ecco perché di solito sovrascrivo il metodo Html.CheckBox con il mio. L'implementazione predefinita è solo confusa.

+0

Sì, è confuso. Ho modificato la mia domanda per mostrare il codice effettivo che ho finito usando. Ero ancora in grado di usare la sintassi '@ Html', poiché offre alcuni vantaggi. E, certo, se esamino il markup, contiene l'attributo 'value = 'true''. –

+0

@JonathanWood Il tuo codice attuale sopra sembra perfetto, è esattamente quello che avrei fatto. –

0

So che è contrassegnato come accettato, ma ho avuto il problema simile ma stavo iterando su voci secondarie quindi ho avuto problemi con il parametro name bool?isOpen

Quando ho usato questo è lo legano al ViewModel il post, ma rese la discesa:

@Html.EditorFor(model => model.Days[i].isOpen) 

Questo ha reso la casella di controllo, ma i valori in cui nulla nel post:

@Html.EditorFor("isOpen", model.Days[i].isOpen ?? false) 

Osservando all'html reso ho fatto questo nella vista che lo ha risolto:

@Html.CheckBox("Days[" + i +"].isOpen", Model.Days[i].isOpen ?? false) 

So che è so che è un po 'veloce e sporco ma ha funzionato

Spero che questo aiuti qualcuno da qualche parte.