我有以下Action方法,它有一个带有字符串列表的viewBag: -
public ActionResult Login(string returnUrl)
{
List<string> domains = new List<string>();
domains.Add("DomainA");
ViewBag.ReturnUrl = returnUrl;
ViewBag.Domains = domains;
return View();
}
在视图上我试图建立一个下拉列表,显示viewBag字符串如下: -
@Html.DropDownList("domains",(SelectList)ViewBag.domains )
但我收到以下错误: -
无法将类型'System.Collections.Generic.List'转换为 'System.Web.Mvc.SelectList'
所以有人可以为什么我不能填充我的DropDown列表中的蜇伤列表? 感谢
答案 0 :(得分:27)
因为DropDownList
不接受字符串列表。它接受IEnumerable<SelectListItem>
。您有责任将您的字符串列表转换为该字符串。这很容易:
domains.Select(m => new SelectListItem { Text = m, Value = m })
然后,您可以将其提供给DropDownList
:
@Html.DropDownList("domains", ((List<string>)ViewBag.domains).Select(m => new SelectListItem { Text = m, Value = m }))
答案 1 :(得分:4)
ViewBag不是强类型的。您可以使用ViewModel类将实例传递给视图,以便该视图可以使用多个数据源。
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;}
}
答案 2 :(得分:3)
要完成Chris Pratt的回答,这里有一些示例代码来创建下拉列表:
@Html.DropDownList("domains", new SelectList(((List<string>)ViewBag.domains).Select(d => new SelectListItem { Text = d, Value = d }), "Value", "Text"))
将产生以下标记:
<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>
答案 3 :(得分:0)
@Html.DropDownListFor(
m => m.Country,
new SelectList(_CountryList, "CountryID", "Title"),
new { @class = "form-control" }
)
答案 4 :(得分:0)
您确实需要为每个值使用“键”或索引,因为您必须将每个名称转换为IEnumerable<SelectListItem>
,这需要显示ID值和文本字符串。您可以使用以下两种方法之一进行操作:
使用字典
制作一个Dictionary<int, string>
:
Dictionary<int, string> domainDict = new Dictionary<int, string>();
并且每次添加域时,都会添加一个数字:
domainDict.Add(1, "DomainA");
如果您具有包含多个域的此信息的源列表,则可以在该列表上执行foreach
,并使用类似于我在下面显示的索引器变量,而不是手动添加项目。
您将需要一个模型。创建一个名为DomainViewModel.cs
的类,并将其添加到内部:
public class DomainViewModel()
{
public int Id { get; set; }
public string Name { get; set; }
}
然后遍历字典,将项目添加到DomainViewModel
,然后将每个项目添加到List<DomainViewModel>
,与下一部分中的内容类似,除了它看起来像这样:
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);
}
(跳到完成,如下)
使用循环索引器列出迭代
如果您不想使用Dictionary<>
,则可以通过迭代List<string>
并将其直接放入List<DomainViewModel>
的方式动态添加索引。这是您的操作方式:
1)确保您已经从上方创建了DomainViewModel.cs
类。
2)编辑控制器函数以构建您的List<string>
,然后对其进行迭代以使用索引器变量({{1}将它以DomainViewModel
的块形式添加到新的List<DomainViewModel>
中}):
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++;
}
后,您可以执行以下操作:
List<DomainViewModel>
并在您的视图中显示如下:
IEnumerable<SimpleListItem> domainList =
lstDomainModel.Select(d => new SelectListItem {
Text = d.Name,
Value = d.Id.ToString()
}
);
ViewBag.Domains = domainList;