2011-10-06 12 views
6

Tengo el tipo típico de lista desplegable YesNo en la aplicación. Para eso, he desarrollado una clase de modelo (en lugar de la utilidad ViewModel) para futuros prupose de extensión.DropDownListFor (...) seleccionando booleano falso de forma predeterminada

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 }); 
     } 

Entonces, se unen en la vista como la siguiente:

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

En la vista, los tres parámetros son cada pantalla es decir, "Select", "Sí" y "No". Pero, por defecto, se ha seleccionado "No". Si hago la propiedad "Valor" como un número entero, entonces funciona bien y de forma predeterminada se selecciona "Seleccionar", pero como se menciona en el código, si tiendo a ir con el tipo de bool, entonces se selecciona "No".

Cómo obtener un comportamiento normal cuando DataValueField es bool?

Respuesta

7

Modelo:

public bool? Value { get; set; } 

Vista:

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

Esto hace que una lista desplegable automáticamente con 3 estados que responden a los 3 estados de un bool anulable: null, verdadero, falso. Si necesita responder que valor que puede usar las anotaciones de datos de este modo:

Modelo:

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

La conclusión es que su modelo tiene que ser un modelo real - que necesita para modelar los valores de entrada de desarmar para establecer Si necesita ingresar un int, es probable que desee utilizar un int nullable (por lo que int?) y requerir el valor. De esta forma, el valor inicial es nulo en lugar de 0. Es similar a otros tipos de datos, excepto string, que ya puede contener nulos.

+0

Gracias por la respuesta. Pero, supongo que mi pregunta fue malentendida. Actualmente, con valor bool por defecto, se selecciona "NO". En su lugar, quiero "Seleccionar", que se debe seleccionar OptionLabel. – StartingFromScratch

+0

Voy a dejar que otra persona responda esa - usted debe proporcionar el modelo 'DropDown' para ellos. – Cymen

+0

No tengo suficiente reputación para publicar el código ... :(Supongo que el problema es con el tipo de expresión lambda. En el código anterior, el tipo de x => x.SelectedValue es bool. Eso obliga al motor a seleccionar el último "falso" "valor en la colección proporcionada. Sin embargo, no estoy seguro" – StartingFromScratch

1

Sé que este es un tema antiguo, pero pensé que para otros esto podría ser útil para conocer un poco sobre el tema.

no está seleccionado por defecto porque el valor predeterminado de un bool es falsa

si usted acaba de establecer el modelo a ser un Bool nulables como esto en su modelo de vista, entonces debe de forma predeterminada seleccione su defecto valor. :

public bool? Value { get; set; } 

y luego que acaba de establecer su lista desplegable como este en la vista:

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

el resultado de esto debería ser que cuando el bool es nula la opción seleccionada de forma automática debe ser su valor por defecto {Default Select Value}

3

En mi caso tenía un montón de estas listas desplegables en la misma página y pensé que sería inteligente y reutilizaría la lista de selección, por ejemplo

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

y en la vista

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

que no estaba funcionando.Me inicializa una lista de selección independiente para cada desplegable y que solucionó el problema

9

modelo de vista

public bool flag { get; set; } 

Ver

@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

Esto no funciona si tiene la anotación de datos '[Obligatorio]' en el modelo. –

+1

Correcto, la validación de JavaScript debería ser utilizada. – JoshYates1980

+1

¡Funcionó como un amuleto para mí! Simplemente dejé fuera el tercer parámetro "Seleccionar ....." ya que estaba tratando con un campo obligatorio para que siempre se llenara. – Reddy

Cuestiones relacionadas