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);
Thank you! Genau das habe ich mir erhofft. – Paul