Html.DropdownListPara el valor seleccionado que no se establece

97

¿Cómo puedo establecer el valor seleccionado de un Html.DropDownListFor? He estado buscando en línea y he visto que se puede lograr usando el cuarto parámetro, como el siguiente:

@Html.DropDownListFor(m => m, new SelectList(Model, "Code", "Name", 0),  "Please select a country")

Mi lista de selección se muestra así:

<select id="ShipFromCountries" name="ShipFromCountries">
     <option value="">Please select a country</option>
     <option value="GB">United Kingdom</option>
     <option value="US">United States</option>
     ...
</select>

Pero, por alguna razón, Reino Unido permanece seleccionado, pero quiero que se seleccione "Seleccione un país".

¿Alguien sabe cómo puedo lograr esto?

EDITAR

Actualicé mi código ya que hubo un ligero cambio en la funcionalidad, sin embargo, parece que todavía tengo este problema. Esto es lo que está en mi opinión:

@Html.DropDownListFor(n => n.OrderTemplates, new SelectList(Model.OrderTemplates, "OrderTemplateId", "OrderTemplateName", 1), "Please select an order template")

1es el Id del optionque quiero seleccionar, también lo he probado con el texto del optionpero eso tampoco funciona.

¿Algunas ideas?

Ibrar Hussain
fuente

Respuestas:

181

Su código tiene algunos problemas conceptuales:

Primero ,

@Html.DropDownListFor(n => n.OrderTemplates, new SelectList(Model.OrderTemplates, "OrderTemplateId", "OrderTemplateName", 1), "Please select an order template")

Al usar DropDownListFor, el primer parámetro es la propiedad donde se almacena el valor seleccionado una vez que envía el formulario. Entonces, en su caso, debe tener SelectedOrderIdcomo parte de su modelo o algo así, para poder usarlo de esta manera:

@Html.DropDownListFor(n => n.SelectedOrderId, new SelectList(Model.OrderTemplates, "OrderTemplateId", "OrderTemplateName", 1), "Please select an order template")

Segundo ,

Aparte de usar ViewBag, eso no está mal, pero hay mejores formas (coloque esa información en el ViewModel en su lugar), hay un "pequeño error" (o un comportamiento inesperado) cuando su propiedad ViewBag, donde está sosteniendo la SelectList, es el mismo nombre de la propiedad donde puso el valor seleccionado. Para evitar esto, simplemente use otro nombre al nombrar la propiedad que contiene la lista de elementos.

Algún código que usaría si fuera usted para evitar estos problemas y escribir un mejor código MVC:

Modelo de vista:

public class MyViewModel{
   public int SelectedOrderId {get; set;}
   public SelectList OrderTemplates {get; set;}

   // Other properties you need in your view
}

Controlador:

public ActionResult MyAction(){
   var model = new MyViewModel();
   model.OrderTemplates = new SelectList(db.OrderTemplates, "OrderTemplateId", "OrderTemplateName", 1);
   //Other initialization code

   return View(model);
}

En tu opinión:

@Html.DropDownListFor(n => n.SelectedOrderId, Model.OrderTemplates, "Please select an order template")
Romias
fuente
42
Salvé mi día: "... hay un pequeño error cuando su propiedad ViewBag donde tiene la lista de selección es el mismo nombre de la propiedad donde puso el valor seleccionado. Para evitar esto, simplemente use otro nombre al nombrar la propiedad que contiene la lista de elementos ". ¡Gracias!
Michael A. Volz alias Flynn
4
¡Este "pequeño bicho" es una locura absoluta! Solo desperdicié 2 horas de mi vida por esto. ¿Cómo es posible que algo tan obvio siga existiendo y no se repare?
cen
1
Flynn, tu comentario debería ser una respuesta. Probé implementaciones locas para que mi lista desplegable funcionara y esta fue la solución simple
Dwayne Hinterlang
2
hay un pequeño error ? No es un error en absoluto. La vinculación de modelos funciona vinculando al valor de una propiedad y cuando se vincula a OrderTemplatessu intento de vincular a una ViewBagpropiedad que es typeof IEnumerabe<SelectListItem>. Pero un <select>elemento no se puede vincular a una colección de objetos complejos (solo un tipo de valor)
Mierda, habría desperdiciado un día entero si no fuera por esta respuesta. En serio, ese LITTLE BUG es la razón por la que deberíamos abandonar la bolsa de visualización
Worthy7
22

Para mí no estaba funcionando, así que funcionó de esta manera:

Controlador:

int selectedId = 1;

ViewBag.ItemsSelect = new SelectList(db.Items, "ItemId", "ItemName",selectedId);

Ver:

@Html.DropDownListFor(m => m.ItemId,(SelectList)ViewBag.ItemsSelect)

JQuery:

$("document").ready(function () {
    $('#ItemId').val('@Model.ItemId');
});
EL PECADO DE VINICIUS
fuente
2
Su controlador tiene el número incorrecto de paréntesis: tiene un paréntesis de apertura y dos paréntesis de cierre.
Amos Long
La lógica de JQuery funciona para mí. Gracias.
Shashank
7

Cuando pasa un objeto como este:

new SelectList(Model, "Code", "Name", 0)

estás diciendo: la Fuente ( Model) y la Tecla ( "Code") el Texto ( "Name") y el valor seleccionado 0. Probablemente no tenga un 0valor en su fuente para la Codepropiedad, por lo que HTML Helper seleccionará el primer elemento para pasar el valor seleccionado real a este control.

Felipe Oriani
fuente
3

Asegúrese de haber recortado el valor seleccionado antes de realizar la asignación.

//Modelo

public class SelectType
{
    public string Text { get; set; }
    public string Value { get; set; }
}

//Controlador

var types = new List<SelectType>();
types.Add(new SelectType() { Value =  0, Text = "Select a Type" });
types.Add(new SelectType() { Value =  1, Text = "Family Trust" });
types.Add(new SelectType() { Value =  2, Text = "Unit Trust"});
ViewBag.PartialTypes = types;

//Ver

@Html.DropDownListFor(m => m.PartialType, new SelectList(ViewBag.PartialTypes, "Value", "Text"), new { id = "Type" })
Nalan Madheswaran
fuente
2

Si sabe lo que habrá en la vista, también puede establecer el valor predeterminado desde Controller en lugar de configurarlo en el archivo view / cshtml. No es necesario establecer un valor predeterminado desde el lado HTML.

En el archivo Controller.

commission.TypeofCommission = 1;
return View(commission);

En el archivo .cshtml.

@Html.DropDownListFor(row => row.TypeofCommission, new SelectList(Model.commissionTypeModelList, "type", "typeName"), "--Select--")
Smit Patel
fuente
1

Deberías olvidar la clase

SelectList

Use esto en su controlador:

var customerTypes = new[] 
{ 
    new SelectListItem(){Value = "all", Text= "All"},
    new SelectListItem(){Value = "business", Text= "Business"},
    new SelectListItem(){Value = "private", Text= "Private"},
};

Seleccione el valor:

var selectedCustomerType = customerTypes.FirstOrDefault(d => d.Value == "private");
if (selectedCustomerType != null)
    selectedCustomerType.Selected = true;

Agregue la lista a ViewData:

ViewBag.CustomerTypes = customerTypes;

Use esto en su Vista:

@Html.DropDownList("SectionType", (SelectListItem[])ViewBag.CustomerTypes)

-

Más información en: http://www.asp.net/mvc/overview/older-versions/working-with-the-dropdownlist-box-and-jquery/using-the-dropdownlist-helper-with-aspnet-mvc

g. brisa
fuente
0

Agregar la sección del controlador

  ViewBag.Orders= new SelectList(db.Orders, "Id", "business", paramid);

Agregar la sección Html

   @Html.DropDownList("Orders", null)

Un método simple

ibrahim ozboluk
fuente
Un procesamiento de transacciones alternativo fácil
ibrahim ozboluk
0

Para mi solución general :)

@{
     var selectedCity = Model.Cities.Where(k => k.Id == Model.Addres.CityId).FirstOrDefault();
     if (selectedCity != null)
     { 
         @Html.DropDownListFor(model => model.Addres.CityId, new SelectList(Model.Cities, "Id", "Name", selectedCity.Id), new { @class = "form-control" })
     }
     else
     { 
         @Html.DropDownListFor(model => model.Cities, new SelectList(Model.Cities, "Id", "Name", "1"), new { @class = "form-control" })
     }
}
Hamit YILDIRIM
fuente
0

Enlace al menú desplegable con elemento vacío, elemento seleccionado (funciona al 100%)
(muy escrito, posibilidades de error mínimo) Cualquier cambio de modelo se reflejará en la encuadernación

Controlador

public ActionResult ManageSurveyGroup()
    {
        tbl_Survey sur = new tbl_Survey();
        sur.Survey_Est = "3";

        return View(sur);
    }

Ver

        @{


    //Step One : Getting all the list
    var CompEstdList = (from ComType in db.tbl_CompEstdt orderby ComType.Comp_EstdYr select ComType).ToList();

    //Step Two  : Adding a no Value item **
    CompEstdList.Insert(0, new eDurar.Models.tbl_CompEstdt { Comp_Estdid = 0, Comp_EstdYr = "--Select Company Type--" });

    //Step Three : Setting selected Value if value is present
    var selListEstd= CompEstdList.Select(s => new SelectListItem { Text = s.Comp_EstdYr, Value = s.Comp_Estdid.ToString() });

        }
        @Html.DropDownListFor(model => model.Survey_Est, selListEstd)
        @Html.ValidationMessageFor(model => model.Survey_Est)

Este método para vincular datos también es posible

var selList = CompTypeList.Select(s => new SelectListItem { Text = s.CompTyp_Name, Value = s.CompTyp_Id.ToString(), Selected = s.CompTyp_Id == 3 ? true : false });

fuente
var selList = CompTypeList.Select (s => new SelectListItem {Text = s.CompTyp_Name, Value = s.CompTyp_Id.ToString (), Selected = s.CompTyp_Id == 3? verdadero: falso});
0

Sé que esto no es realmente una respuesta a la pregunta, pero estaba buscando una manera de inicializar DropDownList de una lista sobre la marcha en la vista cuando seguía tropezando con esta publicación.

Mi error fue que intenté crear una lista de selección a partir de un diccionario como este:

//wrong!
@Html.DropDownListFor(m => m.Locality, new SelectList(new Dictionary<string, string>() { { Model.Locality, Model.Locality_text } }, Model.Locality, ...

Luego fui a indagar en el documento oficial de msdn y descubrí que DropDownListForno necesariamente requiere SelectList, sino más bien IEnumerable<SelectListItem>:

//right
@Html.DropDownListFor(m => m.Locality, new List<SelectListItem>() { new SelectListItem() { Value = Model.Locality, Text = Model.Locality_text, Selected = true } }, Model.Locality, new { @class = "form-control select2ddl" })

En mi caso, probablemente también pueda omitir el Model.Localityelemento seleccionado, ya que es a) el único elemento yb) ya lo dice en la SelectListItem.Selectedpropiedad.

En caso de que se lo pregunte, la fuente de datos es una página AJAX, que se carga dinámicamente mediante el control SelectWoo / Select2.

Damian Vogel
fuente
0
public byte UserType
public string SelectUserType

Necesita obtener uno y establecer uno diferente. El valor seleccionado no puede ser el mismo elemento que está a punto de establecer.

@Html.DropDownListFor(p => p.SelectUserType, new SelectList(~~UserTypeNames, "Key", "Value",UserType))

Yo uso el diccionario Enum para mi lista, por eso hay un par "clave", "valor".

MEO
fuente
0

Tuve un problema similar, estaba usando ViewBag y el nombre del elemento de la misma manera. (Error de mecanografía)

Arun Prasad ES
fuente
0

Se trata de problemas de CSS. No sé por qué @ Html.DropDownListFor en Bootstrap 4 funciona mejor. Seguramente este es un problema de diseño de clases. De todos modos, el entorno de trabajo es, si su cuadro de entrada desplegable tiene CSS Padding: #px, # px; luego desactívelo. Espero que esto funcione.

naz hassan
fuente