具有IEnumerable数据类型的下拉列表

时间:2011-07-10 21:59:30

标签: c# asp.net-mvc model-view-controller asp.net-mvc-3

我的模型看起来像这样

    public IEnumerable<SelectListItem> ProductTypes { get; set; }

    public ProductContent()
    {
        productxEntities db = new productxEntities();

        ProductTypes = db.ProductCodes.Select(c => new SelectListItem
        {
            Value = c.product_type.ToString(),
            Text = c.code.ToString()
        });



    }

当我尝试将它用于DropDownList时,我得到一个错误,说明转换是错误的...在MVC3 Razor C#中使用DB中的列表填充DDL的正确方法是什么,我有一个紧密耦合的视图这种型号。

@Html.DropDownList("ProductTypes", (IEnumerable<SelectListItem>) Model.ProductTypes)

这是错误

  

无法转换类型为'System.Data.Entity.Infrastructure.DbQuery 1[System.Web.WebPages.Html.SelectListItem]' to type 'System.Collections.Generic.IEnumerable 1 [System.Web.Mvc.SelectListItem]'的对象。

这是我的控制器

public ActionResult Create()
    {
        ProductContent productViewModel = new ProductContent();
        return PartialView("../PartialViews/NewProduct", productViewModel);
    } 

2 个答案:

答案 0 :(得分:10)

您应该在EF查询的某处调用ToList。否则,您将直接向View返回Queryable。

可能是这样的:

public ProductContent()
{
    productxEntities db = new productxEntities();

    ProductTypes = db.ProductCodes.ToList().Select(c => new SelectListItem
    {
        Value = c.product_type.ToString(),
        Text = c.code.ToString()
    });
}

正如我在评论中提到的那样;我不鼓励在Model的构造函数中使用这种代码。其他人应该将其分配给模型。

然后,您应该可以在视图中删除您的演员了。

答案 1 :(得分:3)

问题的根源是System.Web.WebPages.Html.SelectListItemSystem.Web.Mvc.SelectListItem类型不可分配。

控制器中可能存在与视图不同的命名空间导入。在这种情况下,您需要明确:模型需要使用new System.Web.Mvc.SelectListItem(...)或视图需要转换为(IEnumerable<System.Web.WebPages.Html.SelectListItem>)