Tengo el siguiente método de Acción, que tienen un viewBag con una lista de cadenas:-

public ActionResult Login(string returnUrl)
        {
            List<string> domains = new List<string>();
    domains.Add("DomainA");

            ViewBag.ReturnUrl = returnUrl;
            ViewBag.Domains = domains;
            return View();
        }

y en el punto de vista que estoy tratando de construir una lista desplegable que muestra el viewBag de cadenas como sigue:-

@Html.DropDownList("domains",(SelectList)ViewBag.domains )

Pero tengo el siguiente error :-

No se puede convertir el tipo ‘System.Las colecciones.Genérica.La lista’ a
‘Sistema.Web.Mvc.SelectList’

Así que cualquiera puede adive ¿por qué no puedo llenar mi lista Desplegable de una lista de las picaduras ?
Gracias

InformationsquelleAutor john Gu | 2014-01-30

5 Comentarios

  1. 29

    Porque DropDownList no aceptar una lista de cadenas. Se acepta IEnumerable<SelectListItem>. Es su responsabilidad para convertir tu lista de cadenas en que. Esto es bastante fácil, aunque:

    domains.Select(m => new SelectListItem { Text = m, Value = m })

    A continuación, puede alimentar a DropDownList:

    @Html.DropDownList("domains", ((List<string>)ViewBag.domains).Select(m => new SelectListItem { Text = m, Value = m }))
    • Aún así obtener 'Cannot convert type 'System.Web.Mvc.SelectListItem[]' to 'System.Collections.Generic.List<string>''
    • El código asume que ViewBag.domains es un List<string> porque es en el OP pregunta. Suena como en su caso, la ViewBag miembro ya es un IEnumerable<SelectListItem> así que debe dar a la vez.
    • Sí, yo tenía a la espalda que todo el elenco de cuando me fui a la parte de vista: @Html.DropDownList("agency_id", (IEnumerable<SelectListItem>)ViewData["agency_id"]) era como la mía parecía, en la final. Le estaba dando de comer a esto: var agencies = db.AGENCIES.OrderBy(e => e.FULLNAME).ToList(); var agenciesList = agencies.Select(d => new SelectListItem { Text = d.FULLNAME, Value = d.AGENCY_ID.ToString() }); ViewData["agency_id"] = agenciesList;
  2. 4

    Para completar Chris Pratt respuesta, aquí está el código de ejemplo para crear la lista desplegable :

    @Html.DropDownList("domains", new SelectList(((List<string>)ViewBag.domains).Select(d => new SelectListItem { Text = d, Value = d }), "Value", "Text"))

    Que producirá el siguiente marcado :

    <select id="domains" name="domains">
        <option value="item 1">item 1</option>
        <option value="item 2">item 2</option>
        <option value="item 3">item 3</option>
    </select>
    • No es necesario crear una instancia de SelectList. Todos DropDownList requiere es IEnumerable<SelectListItem>.
    • List<string> no contiene una definición para Select y ningún método de extensión Select la aceptación de un primer argumento de tipo List<string> podría ser encontrado. Mi aplicación MVC 5, tal vez algo ha cambiado desde este post? No estoy seguro de cómo los ensamblados de referencia de la página de vista, que podría ser mi problema?
  3. 4

    ViewBag no es inflexible. Usted puede utilizar ViewModel para pasar clases de instancias a la vista de forma que puede utilizar más de una fuente de datos.

        public ActionResult Login(string returnUrl)
        {
            List<string> domains = new List<string>();
            domains.Add("DomainA");
    
            ViewModel model=new ViewModel();
            model.ReturnUrl = returnUrl;
            model.Domains =new SelectList(domains);
            return View(model);
        }
    
        Public Class ViewModel()
        {
            property Url ReturnUrl{get;set;}
            property SelectList Domains{get;set;}
        }
  4. 0
    @Html.DropDownListFor(
         m => m.Country, 
              new SelectList(_CountryList, "CountryID", "Title"),
              new { @class = "form-control" }
    )
    • Necesita el código para el llenado de _CountryList para que esto sea un ejemplo. Sólo el código de respuestas, a menos obvio, son desalentados.
  5. 0

    Usted realmente necesita tener una «clave», o índice, para cada valor, porque usted tiene que convertir cada nombre a una IEnumerable<SelectListItem>, que requiere un valor de IDENTIFICADOR y una cadena de Texto para mostrar. Usted podría hacer que el uso de una de dos maneras:

    Usar un Diccionario

    Hacer un Dictionary<int, string>:

    Dictionary<int, string> domainDict = new Dictionary<int, string>();

    y cada vez que se agrega un dominio, agregar un número:

    domainDict.Add(1, "DomainA");

    Si usted tiene una lista de fuentes para esta información con múltiples dominios, usted podría hacer un foreach en la lista y utilizar un indizador variable similar a lo que te voy a mostrar, a continuación, en lugar de añadir manualmente los elementos.

    Se necesita un modelo. Crear una clase llamada DomainViewModel.cs y agregar esta dentro de:

    public class DomainViewModel()
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

    Luego iterar a través de su diccionario para añadir elementos a un DomainViewModel y, a continuación, agregue cada uno de estos elementos en un List<DomainViewModel>, similar a lo que tengo en la siguiente sección, excepto que se vería así:

    List<DomainViewModel> lstDomainModel = new List<DomainViewModel>();
    
    foreach(KeyValuePair<int, string> kvp in domainDict)
    {
        DomainViewModel d = new DomainViewModel();
        d.Id = kvp.Key;  //number 
        d.Name = kvp.Value;  //domain name
        lstDomainModel.Add(d);
    }

    (Pase a la Terminando, a continuación)

    Lista de iteración con bucle indizador

    Si usted no desea utilizar un Dictionary<>, se podría agregar el índice sobre la marcha por iteración en la List<string> y ponerlo en un List<DomainViewModel> directamente. Aquí está cómo hacerlo:

    1) Asegurarse de que haya creado el DomainViewModel.cs clase desde arriba.

    2) Editar su función de controlador para construir su List<string>, luego iterar sobre ella para añadir en trozos de DomainViewModel a un nuevo List<DomainViewModel> utilizando un indizador variable (idx):

    List<string> domains = new List<string>();
    domains.Add("DomainA");  //etc.
    
    List<DomainViewModel> lstDomainModel = new List<lstDomainModel>();
    int idx = 0;
    
    //Add your List<string> to your List<DomainViewModel>
    foreach (string s in domainList)
    {
        DomainViewModel domainModel = new DomainViewModel();
        domainModel.Id = idx;
        domainModel.Name = s;
        lstDomainModel.Add(domainModel);
        idx++;
    }

    Terminando

    Utilizando cualquier método, una vez que lo tienes en un List<DomainViewModel>, se podría:

    IEnumerable<SimpleListItem> domainList = 
        lstDomainModel.Select(d => new SelectListItem { 
                Text = d.Name, 
                Value = d.Id.ToString() 
            }
        );
    ViewBag.Domains = domainList;

    Y se mostrará en la vista como este:

    @Html.DropDownList("Domains", (IEnumerable<SelectListItem>)ViewBag.Domains)

Dejar respuesta

Please enter your comment!
Please enter your name here