2014-01-30 7 views
12

Ich habe die folgende Aktion-Methode, die eine viewBag mit einer Liste von Strings haben konvertieren: -Kann nicht Typ ‚System.Collections.Generic.List <string>‘ auf ‚System.Web.Mvc.SelectList‘

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

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

und auf der Ansicht, ich versuche, eine Dropdown-Liste zu erstellen, die die viewBag Strings wie folgt dargestellt: -

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

Aber ich habe folgende Fehlermeldung: -

Kann nicht

So kann Typ ‚System.Collections.Generic.List‘ zu ‚System.Web.Mvc.SelectList‘ konvertieren jemand adive, warum ich nicht meine Dropdown-Liste mit einer Liste von Stichen füllen können? Danke

Antwort

23

Weil DropDownList nicht akzeptiert eine Liste von Zeichenfolgen. Es akzeptiert IEnumerable<SelectListItem>. Es liegt in Ihrer Verantwortung, Ihre String-Liste in diese umzuwandeln. Dies ist leicht genug, aber:

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

Dann können Sie das zu DropDownList füttern:

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

Chris Pratt Antwort abgeschlossen haben, hier einige Beispielcode das Drop-down zu erstellen:

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

Das ergibt die folgende Markierung:

<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> 
+0

Sie müssen keine Instanz von 'SelectList' erstellen. Alles, was "DropDownList" benötigt, ist 'IEnumerable '. –

4

ViewBag ist nicht stark typisiert. Sie können ViewModel-Klassen verwenden, um anzuzeigende Instanzen zu übergeben, sodass in der Ansicht mehr als eine Datenquelle verwendet werden kann.

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

     ViewModel model=new ViewModel(); 
     miewModel.ReturnUrl = returnUrl; 
     miewModel.Domains =new SelectList(domains); 
     return View(model); 
    } 

    Public Class ViewModel() 
    { 
     property Url ReturnUrl{get;set;} 
     property SelectList Domains{get;set;} 
    } 
0
@Html.DropDownListFor(
    m => m.Country, 
      new SelectList(_CountryList, "CountryID", "Title"), 
      new { @class = "form-control" } 
)