为什么我的Html.DropDownList给我一个填充“System.Web.Mvc.SelectListItem”字符串的列表?

问题描述:

我在这个网站上研究过这个问题,发现了几个类似的问题。我尝试了所有提供的建议,但很明显,我的实现或对解释的理解都会导致这些解决方案无法正常工作。我将不胜感激关于如何解决这个问题的一些指导。为什么我的Html.DropDownList给我一个填充“System.Web.Mvc.SelectListItem”字符串的列表?

我的项目包括以下视图模型的:

public SelectList MonthList { get; set; } 


public SelectList ReverseMonthsLists() 
{ 
    var stringViewOfDates = GetDates().Select(_ => _.ToString("MMM yyyy")).ToList(); 
    var list = new List<SelectListItem>(); 
    list.Add(new SelectListItem { Selected = true, Text = stringViewOfDates[0], Value = stringViewOfDates[0] }); 

    for (int i = 1; i < stringViewOfDates.Count(); i++) 
    { 
     list.Add(new SelectListItem { Selected = false, Text = stringViewOfDates[i], Value = stringViewOfDates[i] }); 
    } 

    var selectList = new SelectList(list); 
    return selectList; 
} 


public static IEnumerable<DateTime> GetDates() 
{ 
    DateTime startDate = new DateTime(2017, 6, 1).Date; 
    var currentDate = DateTime.Now.Date; 

    int numberOfMonthsToShow = (currentDate.Year - startDate.Year) * 12 + currentDate.Month - startDate.Month; 

    if (numberOfMonthsToShow == 0) 
     numberOfMonthsToShow = 1; 

    var dates = new List<DateTime>(numberOfMonthsToShow); 
    for (int i = 0; i < numberOfMonthsToShow; i++) 
    { 
     dates.Add(currentDate); 
     currentDate = currentDate.AddMonths(-1); 
    } 
    return dates; 
} 

我的HTML视图包含着这样一句话:

@Html.DropDownList("selectList", Model.ReverseMonthsLists(), "Month 
Selector") 

什么我doning错误是造成我的下拉列表,以填补不过是“系统.Web.Mvc.SelectListItem“?

Html.DropDownList的第二个参数需要IEnumerable<SelectListItem>,而不是SelectList

尝试改变的视图模型的方法:

public IEnumerable<SelectListItem> ReverseMonthsLists() 
    { 
     var stringViewOfDates = GetDates().Select(_ => _.ToString("MMM yyyy")).ToList(); 
     var list = new List<SelectListItem>(); 
     list.Add(new SelectListItem { Selected = true, Text = stringViewOfDates[0], Value = stringViewOfDates[0] }); 

     for (int i = 1; i < stringViewOfDates.Count(); i++) 
     { 
      list.Add(new SelectListItem { Selected = false, Text = stringViewOfDates[i], Value = stringViewOfDates[i] }); 
     } 

     return list; 
    } 

其实你可以它简化为:

public IEnumerable<SelectListItem> ReverseMonthsLists() 
    { 
     var selectListItems = GetDates() 
      .Select(_ => _.ToString("MMM yyyy")) 
      .Select((dateString, index) => new SelectListItem { Selected = index == 0, Text = dateString, Value = dateString}) 
      .ToList(); 
     return selectListItems; 
    } 
+0

您可以删除“选定=假”,因为它总是被初始化为假 –

+0

本解决方案完美工作,包括我的视图模型方法的简化版本。简单,清晰,简短。谢谢! – csharpMind

你尝试设置数据和文本字段?

ASP.NET MVC Dropdown List From SelectList

var selectList = new SelectList(list, "Value" , "Text");