2013-06-04 14 views
6

Ich bin derzeit nicht glücklich mit der Art und Weise, wie meine DropDownListFor() - Objekte gefüllt sind. Ich versuche, IEnumerable so allgemein wie möglich zu finden. Das habe ich bisher.ASP.NET MVC 3 Liste <T> zu IEnumerable <SelectListItem>

Helper:

public static List<SelectListItem> ToSelectList(IDictionary<string,string> dictionaryItems, string selectedValue, string noSelection, bool search = false) 
    { 
     List<SelectListItem> items = new List<SelectListItem>(); 

     if (search) 
     { 
      items.Add(new SelectListItem { Selected = true, Value = "-1", Text = string.Format("-- {0} --", noSelection) }); 
     } 

     foreach (var item in dictionaryItems) 
     { 
      items.Add(new SelectListItem 
      { 
       Text = item.Key, 
       Value = item.Value, 
       Selected = selectedValue == item.Value ? true : false 
      }); 
     } 

     return items 
      .OrderBy(l => l.Text) 
      .ToList(); 
    } 

Controller:

[HttpGet] 
    public ActionResult Index() 
    { 
     var model = new CreateModel(); 

     var parentOrganisations = _orgs.FindBy(o => o.OwningOrganisationID == Globals.OrganisationID || o.ID == Globals.OrganisationID) 
      .OrderBy(o => o.OrganisationName); 

     Dictionary<string, string> items = new Dictionary<string, string>(); 

     foreach (var item in parentOrganisations) 
     { 
      items.Add(item.OrganisationName, item.ID.ToString()); 
     } 

     model.Organisations = SelectLists.ToSelectList(items, "-1", "-- None -- ", true); 

     return View(model); 
    } 

Ausblick:

<div class="control-group"> 
     <label class="control-label">Parent Organisation</label> 
     <div class="controls"> 
      @Html.DropDownListFor(m => m.ParentOrganisationID, Model.Organisations, new { @class = "input-xlarge"}) 
      <p class="help-block">Select a parent organisation to create a branch</p> 
     </div> 
    </div> 

Es gibt eine Menge von sich wiederholenden Code in der Steuerung zu sein scheint. Es benötigt eine generische Liste, addiert den Wert und den Text zu einem Dictionary und verwendet dieses dann als Eingabe für einen Helfer, der die Auswahlliste aufbaut, die als Teil des Modells gesendet werden soll.

Hat jemand bessere Möglichkeiten, dies zu erreichen? Ich hasse es, in meinem Controller aufgebläht zu haben, und wenn ich mehrere Dropdowns auf einem Formular erhalte, wird genau das in diesem Fall passieren.

Danke,

EDIT - Dank Kenneth Helfer-Methode habe ich nun das Ganze in einem Aufruf im Controller konsolidiert:

  model.Organisations = _orgs.FindBy(o => o.OwningOrganisationID == Globals.OrganisationID || o.ID == Globals.OrganisationID) 
      .OrderBy(o => o.OrganisationName) 
      .ToList() 
      .ToSelectList(org => org.OrganisationName, org => org.ID.ToString(), "-1", "None", true); 

Antwort

8

Sie Rückrufe, die den Schlüssel zu erhalten liefern könnten und die Wert und dann diese verwenden. Abgesehen davon, dass Sie es als eine Erweiterung Methode zu erstellen:

Erweiterungsmethode:

public static List<SelectListItem> ToSelectList<T>(this List<T> Items, Func<T, string> getKey, Func<T, string> getValue, string selectedValue, string noSelection, bool search = false) 
    { 
     List<SelectListItem> items = new List<SelectListItem>(); 

     if (search) 
     { 
      items.Add(new SelectListItem { Selected = true, Value = "-1", Text = string.Format("-- {0} --", noSelection) }); 
     } 

     foreach (var item in Items) 
     { 
      items.Add(new SelectListItem 
      { 
       Text = getKey(item), 
       Value = getValue(item), 
       Selected = selectedValue == getValue(item) ? true : false 
      }); 
     } 

     return items 
      .OrderBy(l => l.Text) 
      .ToList(); 
    } 

Verbrauch:

List<Org>() parentOrganisations = // fetch here 
model.Organisations = parentOrganisations.ToSelectList(org => org.ID.ToString(), 
                 org => org.OrganisationName, 
                 "-1", 
                 "-- None -- ", 
                 true); 

Hinweis: ich dies in dem SO-Editor eingegeben hat, Sie könnten also einige Syntaxfehler haben (sie sollten jedoch leicht zu lösen sein).

+0

Thank you! Genau das habe ich mir erhofft. – Paul

1

Sie können nur wie dies in der Steuerung tun: -

List<SelectListItem> dropdownItems = parentOrganisations 
    .Select(item => new SelectListItem 
    { 
     Value = item.ID.ToString(), 
     Text = item.OrganisationName, 
     Selected = "-1" == item.ID.ToString() ? true : false 
    }) 
    .ToList(); 
Verwandte Themen