无法将类型'System.Collections.Generic.List <string>'转换为'System.Web.Mvc.SelectList'</string>

时间:2014-01-30 17:56:38

标签: asp.net-mvc asp.net-mvc-4 html-helper

我有以下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列表中的蜇伤列表? 感谢

5 个答案:

答案 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;