2011-06-10 262 views
5

我正在学习ASP.NET MVC。处理dropdownlist时,我遇到了一个小问题。填充ASP.NET MVC中的DropDownlist

这是我在控制器

List<Int32> myList = new List<Int32>(); 
var a = (from m in datacontext.services 
       select m.ServiceID); 
myList = a.ToList(); 
ViewData["ServiceID"] = new SelectList((IEnumerable<SelectListItem>) 
           a.ToList(), "ServiceID", "ServiceID"); 

确实在视图

@Html.DropDownListFor(model => model.ServiceID, ViewData["ServiceID"] as SelectList) 

这将导致一个错误

无法投型“的System.Collections中的对象。 Generic.List 1[System.Int32]' to type 'System.Collections.Generic.IEnumerable 1 [System.Web.Mvc.SelectListItem]'。“

这怎么解决?

什么是最好的方式来处理与查询填充下拉列表?

回答

4

剧组中存在错误。

要解决,你可以这样做:

var a = datacontext.services.Select(arg => new { ServiceID = arg.ServiceID }).ToList(); 
ViewData["ServiceID"] = new SelectList(a, "ServiceID", "ServiceID"); 

或本:

var a = datacontext.services.Select(arg => arg.ServiceID).ToList(); 
ViewData["ServiceID"] = new SelectList(a); 

在你的代码a是整数列表。它不能被投入到SelectListItem的列表中。

附注: myList变量未在您的代码中使用。

+0

谢谢,这工作 – 2011-06-10 02:22:52

0

您需要将Int32的列表转换为列表/ IEnumerable的SelectListItem's。您无法将其作为直接投射(这是您正在尝试执行的操作,以及您错误代表的内容)。

您可以通过更改选择返回类型来调整您的LINQ查询以返回IEnumerable<SelectListItem>

var a = (from m in datacontext.services 
       select new SelectListItem{ Text = m.ServiceID.ToString(), Value = m.ServiceID.ToString() }); 

然后你可以将其加载到SelectList通过:

ViewData["ServiceID"] = new SelectList(a); 
0

另外,如果你有你想要填充文本项的下拉列表中,您可以执行以下操作:

控制器:

public ActionResult Create() 
{ 
    var viewModel = new Store(); 
    var storeTypes = new SelectList(
         ( 
          from t in _db.StoreTypes 
          select new SelectListItem 
          { 
           Text = t.StoreTypeName, 
           Value = SqlFunctions.StringConvert((double)t.StoreTypeID) //convert int to string (yikes) 
          } 
         ) 
         , "Value", "Text"); 

    ViewData["StoreTypes"] = storeTypes;  
    return View(viewModel); 
} 

查看:

<div class="class"> 
    <%: Html.DropDownList("StoreTypeID", (SelectList)ViewData["StoreTypes"]) %> 
    <%--<%: Html.DisplayTextFor(model => model.StoreTypeID) %>--%> 
</div>