2011-10-06 17 views
6

Ho tipico tipo YesNo di discesa nella domanda. Per questo, ho sviluppato la classe model (piuttosto ViewModel Utility) per future extension prupose.DropDownListFor (...) selezionando booleano false per impostazione predefinita

public string Text { get; set; } // represents text part 
     public bool Value { get; set; } // represent value 
     public List<DropDown> DropDowns { get; set; } //list for binding 
     public void BuildYesNoDropDown() 
     { 
      DropDowns = new List<DropDown>(); 
      DropDowns.Add(new DropDown { Text = "Yes", Value = true }); 
      DropDowns.Add(new DropDown { Text = "No", Value = false }); 
     } 

Poi, mi legano nella visualizzazione come segue:

@Html.DropDownListFor(x => x.SelectedValue, new SelectList(Model.DropDowns, "Value", "Text",1),"Select") //last para - OptionLabel 

Nella visualizzazione, tutti e tre i parametri sono sempre di visualizzazione vale a dire "Select", "Sì" e "No". Ma, per impostazione predefinita, "No" è stato selezionato. Se faccio proprietà "Valore" come intero, allora funziona bene e per impostazione predefinita "Seleziona" ottiene selezionato, ma come detto nel codice, se io tendo ad andare con il tipo bool poi "No" viene selezionato.

Come ottenere un comportamento normale quando DataValueField è bool?

risposta

7

Modello:

public bool? Value { get; set; } 

Vista:

@Html.EditorFor(model => model.Value) 

Questo rende automaticamente un elenco a discesa con 3 stati che corrispondono ai 3 stati di un bool annullabile: null, true, false. Se si richiede che il Valore sarà risposto è possibile utilizzare le annotazioni di dati in questo modo:

Modello:

[Required] 
public bool? Value { get; set; } 

L'asporto è il vostro modello deve essere un vero e proprio modello - ha bisogno di modellare i valori di input da non impostato impostare. Se avete bisogno di inserire un int, è probabile che desidera utilizzare un int nullable (così int?) e richiedono il valore. In questo modo il valore iniziale è nullo anziché 0. È simile con altri tipi di dati tranne string che è già annullabile.

+0

Grazie per la risposta. Ma, suppongo che la mia domanda sia stata fraintesa. Attualmente, con il valore bool predefinito, viene selezionato "NO". Invece, voglio "Seleziona" che deve essere selezionata la OptionLabel. – StartingFromScratch

+0

Lascerò che qualcun altro risponda a questo - è necessario fornire il modello 'DropDown' per loro. – Cymen

+0

Non ho abbastanza reputazione per postare il codice ... :(Suppongo che il problema sia con il tipo di espressione lambda. Nel codice precedente, x => il tipo x.SelectedValue è bool. Ciò spinge il motore a selezionare l'ultimo "falso "valore nella raccolta fornita." "Non sono sicuro però!" – StartingFromScratch

1

So che questo è un argomento vecchio, ma ho pensato che per gli altri questo potrebbe tornare utile a conoscere un po 'di storia su.

non è selezionata per impostazione predefinita perché il valore predefinito di un bool è falso

se si imposta il modello per essere un Bool null-grado come questo nel tuo modello di vista allora dovrebbe di default selezionare il predefinito valore. :

public bool? Value { get; set; } 

e poi basta solo impostare il dropdownlist come questo nella vista:

@Html.DropDownListFor(x => x.SelectedValue, new SelectList(Model.DropDowns, "Value", "Text",1),"{Default Select Value}") 

il risultato di questo dovrebbe essere che quando il bool è nullo l'opzione selezionata automaticamente dovrebbe essere il vostro valore predefinito {Default Select Value}

3

Nel mio caso ho avuto un po 'di questi menù a discesa sulla stessa pagina e ho pensato di essere intelligente e riutilizzare la lista di selezione, ad esempio,

var YesOrNoTriState = new List<SelectListItem> { 
    new SelectListItem { Text = "Select", Value = "" }, 
    new SelectListItem { Text = "Yes", Value = true.ToString() }, 
    new SelectListItem { Text = "No", Value = false.ToString() } 
}; 

e nella vista

<%: Html.DropDownListFor(x => x.Field1, Model.YesOrNoTriState) %> 
<%: Html.DropDownListFor(x => x.Field2, Model.YesOrNoTriState) %> 

che non funzionava.Ho inizializzato un elenco di selezione separato per ogni discesa e che risolto il problema

9

ViewModel

public bool flag { get; set; } 

View

@Html.DropDownListFor(model => model.flag, new List<SelectListItem>() 
{ 
    new SelectListItem() { Text = "Yes", Value = "True" }, 
    new SelectListItem() { Text = "No", Value = "False"} 
}, "Select.....", new { @id = "flag", @class="form-control" }) 
@Html.ValidationMessageFor(model => model.flag) 
+0

Questo non funziona se si ha l'annotazione dei dati '[Required]' sul modello. –

+1

È necessario utilizzare la convalida javascript corretta. – JoshYates1980

+1

Ha funzionato come un incantesimo per me! Ho appena escluso il terzo parametro "Seleziona ....." perché avevo a che fare con un campo obbligatorio in modo che fosse sempre compilato. – Reddy

Problemi correlati