【问题标题】:Dropdownlist with IEnumerable Data type具有 IEnumerable 数据类型的下拉列表
【发布时间】:2011-07-10 21:59:29
【问题描述】:

我的模型是这样的

    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.DbQuery1[System.Web.WebPages.Html.SelectListItem]' to type 'System.Collections.Generic.IEnumerable1[System.Web.Mvc.SelectListItem]”的对象。

这是我的控制器

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

【问题讨论】:

  • 你得到了什么错误?错误的确切文本是什么?
  • 将该逻辑放入您的模型中并不是一个好主意。它应该在其他地方。您还应该发布控制器的代码以查看 Action 如何返回模型。
  • 发布错误时我发现错误是由于没有使用 System.Web.Mvc 来选择项目列表,但现在我有一个新错误 LINQ to Entities 无法识别方法 'System.String ToString()' 方法,并且该方法不能翻译成 store 表达式。

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


【解决方案1】:

您应该在 EF 查询中的某处调用 ToList。否则,您将 Queryable 直接返回到您的视图。

可能是这样的:

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

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

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

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

【讨论】:

  • 我现在遇到了这个新错误 LINQ to Entities 无法识别方法 'System.String ToString()' 方法,并且此方法无法转换为存储表达式。
  • 次要:您可能需要在 Select 之后使用 ToList(),否则它会拉出整个表格,而不仅仅是您需要的两列。
  • 你的意思是 ProductTypes = db.ProductCodes.ToList().Select(c => new SelectListItem { Value = c.product_type.ToString(), Text = c.code.ToString() })。 ToLIst();
  • @Natasha - 差不多。没有第一个 ToList:db.ProductCodes.Select(blah).ToList();
  • @user122211:你必须这样做..Select(columns).ToList().Select(new SelectListItem) EF 不知道如何选择 SelectListItem。
【解决方案2】:

问题的根源在于System.Web.WebPages.Html.SelectListItemSystem.Web.Mvc.SelectListItem 类型不可赋值。

很可能在控制器中有不同的命名空间导入到视图中。在这种情况下你需要明确:要么模型需要使用new System.Web.Mvc.SelectListItem(...),要么视图需要转换为(IEnumerable&lt;System.Web.WebPages.Html.SelectListItem&gt;)

【讨论】:

  • 我不完全确定这是如何相关的。问题是试图返回一个 IQueryable,这将不起作用,因为一旦尝试枚举,DB 连接可能会关闭;这不是一个有效的演员表。
  • @vcsjones 问题中的错误是无效转换,而不是 IQueryable;这就是我所说的。您对 IQueryable 的建议是有用且正确的,因为它指出了一个可能的痛点(连接关闭、多个查询执行等)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-12
  • 1970-01-01
相关资源
最近更新 更多