net mvc llenar dropdownlist desde datos asp asp.net drop-down-menu listitem

asp.net - mvc - Agregar ListItems a DropDownList de una lista genérica



html dropdownlist mvc 5 (4)

Porque el método DataBind vincula valores solo si se establece la propiedad DataValueField. Si establece la propiedad DataValueField en "Valor" antes de llamar a DataBind, sus valores aparecerán en el marcado.

ACTUALIZACIÓN: también deberá establecer la propiedad DataTextField en "Texto". Es porque el enlace de datos y la adición de elementos manualmente no funcionan de la misma manera. El enlace de datos no conoce la existencia del tipo ListItem y genera marcado al evaluar los elementos en el origen de datos.

Tengo un código aspx: (muestra)

<asp:DropDownList runat="server" ID="ddList1"></asp:DropDownList>

Con este código detrás:

List<System.Web.UI.WebControls.ListItem> colors = new List<System.Web.UI.WebControls.ListItem>(); colors.Add(new ListItem("Select Value", "0")); colors.Add(new ListItem("Red", "1")); colors.Add(new ListItem("Green", "2")); colors.Add(new ListItem("Blue", "3")); ddList1.DataSource = colors; ddList1.DataBind();

La salida se ve así:

<select name="ddList1" id="ddList1"> <option value="Select Value">Select Value</option> <option value="Red">Red</option> <option value="Green">Green</option> <option value="Blue">Blue</option> </select>

Mi pregunta es: ¿por qué mis valores (números) desaparecieron y el texto se usó como el valor Y el texto? Sé que funciona si uso el ddList1.Items.Add(New ListItem("text", "value")) , pero necesito usar una lista genérica como fuente de datos por otros motivos.


Si está compilando ListItems, no necesita usar DataBind () en primer lugar.

Solo agrégalos a tu DropDownList:

ddList1.Items.Add(new ListItem("Select Value", "0")); ddList1.Items.Add(new ListItem("Red", "1")); ddList1.Items.Add(new ListItem("Green", "2")); ddList1.Items.Add(new ListItem("Blue", "3"));

DataBind () es útil cuando ya tiene un collection / dataobject (normalmente un DataTable o DataView) que se puede usar como un DataSource, configurando DataTextField y DataValueField (como escribió buyutec).


Y aquí está el método que realiza el enlace de datos. Usted puede ver exactamente lo que está pasando:

protected internal override void PerformDataBinding(IEnumerable dataSource) { base.PerformDataBinding(dataSource); if (dataSource != null) { bool flag = false; bool flag2 = false; string dataTextField = this.DataTextField; string dataValueField = this.DataValueField; string dataTextFormatString = this.DataTextFormatString; if (!this.AppendDataBoundItems) { this.Items.Clear(); } ICollection is2 = dataSource as ICollection; if (is2 != null) { this.Items.Capacity = is2.Count + this.Items.Count; } if ((dataTextField.Length != 0) || (dataValueField.Length != 0)) { flag = true; } if (dataTextFormatString.Length != 0) { flag2 = true; } foreach (object obj2 in dataSource) { ListItem item = new ListItem(); if (flag) { if (dataTextField.Length > 0) { item.Text = DataBinder.GetPropertyValue(obj2, dataTextField, dataTextFormatString); } if (dataValueField.Length > 0) { item.Value = DataBinder.GetPropertyValue(obj2, dataValueField, null); } } else { if (flag2) { item.Text = string.Format(CultureInfo.CurrentCulture, dataTextFormatString, new object[] { obj2 }); } else { item.Text = obj2.ToString(); } item.Value = obj2.ToString(); } this.Items.Add(item); } } if (this.cachedSelectedValue != null) { int num = -1; num = this.Items.FindByValueInternal(this.cachedSelectedValue, true); if (-1 == num) { throw new ArgumentOutOfRangeException("value", SR.GetString("ListControl_SelectionOutOfRange", new object[] { this.ID, "SelectedValue" })); } if ((this.cachedSelectedIndex != -1) && (this.cachedSelectedIndex != num)) { throw new ArgumentException(SR.GetString("Attributes_mutually_exclusive", new object[] { "SelectedIndex", "SelectedValue" })); } this.SelectedIndex = num; this.cachedSelectedValue = null; this.cachedSelectedIndex = -1; } else if (this.cachedSelectedIndex != -1) { this.SelectedIndex = this.cachedSelectedIndex; this.cachedSelectedIndex = -1; } }


"Si está compilando ListItems, no necesita usar DataBind () en primer lugar".

Agregar de manera directa a la lista desplegable es la manera más sencilla (y dado que el código de ejemplo es el correcto), pero digamos que tiene un origen de datos no ordenado y desea ordenar los elementos de la lista.

Una forma de lograr esto sería crear una lista genérica de ListItem y luego usar el método de ordenación heredado antes de enlazar datos a la lista.

Hay muchos wys para despellejar a un gato ...