![](/img/trans.png)
[英]IEnumerable<SelectListItem> error in Simple Membership in ASP.NET MVC 5
[英]ASP.NET MVC 3 List<T> to IEnumerable<SelectListItem>
我目前不滿意填充DropDownListFor()對象的方式。 我試圖找到盡可能填充IEnumerable的通用方法。 這就是我到目前為止所擁有的。
幫手:
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();
}
控制器:
[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);
}
視圖:
<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>
控制器中似乎有很多重復的代碼。 它需要一個通用列表,將值和文本添加到字典中,然后將其用作幫助程序的輸入,該幫助程序構建選擇列表以作為模型的一部分發送。
有沒有人有更好的方法來實現這一目標? 我討厭在我的控制器中臃腫,當我在表單上得到幾個下拉時,這正是在這個實例中會發生的事情。
謝謝,
編輯 - 感謝Kenneth的幫助方法,我現在將整個事情整合到控制器中的一個調用中:
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);
您可以提供獲取密鑰和值的回調,然后使用它們。 除此之外,您可以將其創建為擴展方法:
擴展方法:
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();
}
用法:
List<Org>() parentOrganisations = // fetch here
model.Organisations = parentOrganisations.ToSelectList(org => org.ID.ToString(),
org => org.OrganisationName,
"-1",
"-- None -- ",
true);
注意:我在SO編輯器中鍵入了這個,因此您可能會遇到一些語法錯誤(盡管它們應該很容易解決)。
您只能在控制器中執行此操作: -
List<SelectListItem> dropdownItems = parentOrganisations
.Select(item => new SelectListItem
{
Value = item.ID.ToString(),
Text = item.OrganisationName,
Selected = "-1" == item.ID.ToString() ? true : false
})
.ToList();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.