将LINQ查询传递给VIewBag以创建DropDownList

时间:2015-11-25 18:58:54

标签: c# asp.net asp.net-mvc linq razor

我尝试将LINQ查询传递到视图包,以便从我的数据库中提取列表并将其显示在DropDownList中。

这就是我提出的:

List<SelectListItem> ddCompany = new List<SelectListItem>();
var companyList = (from c in leases.tblvCompanies
                   select new {c.Company_ID, c.Company }).ToList();
foreach(var item in companyList)
{
    ddCompany.Add(new SelectListItem { Value = companyList.Company_ID, Text = companyList.Company });
}
ViewBag.ddCompany = ddCompany;

我得到的错误如下:

  

&#39;&System.Collections.Generic.List LT; AnonymousType#1&GT;&#39;不包含   &#39; Company_ID&#39;的定义没有扩展方法&#39; Company_ID&#39;   接受第一个类型的参数   &#39;&System.Collections.Generic.List LT; AnonymousType#1&GT;&#39;可以找到(是   你错过了使用指令或程序集引用?)

有人可以帮我弄清楚它为什么不起作用吗?还有什么不同于这个吗?

修改

感谢KiwiPiet和Robert McKee,这就是它的工作原理:

控制器:

List<SelectListItem> ddCompany = new List<SelectListItem>();
            var companyList = (from c in leases.tblvCompanies
                               orderby c.Company ascending
                               select new { c.Company_ID, c.Company }).ToList();
            foreach (var item in companyList)
            {
                ddCompany.Add(new SelectListItem { Value = item.Company_ID.ToString(), Text = item.Company });
            }
            ViewBag.ddCompanyList = ddCompany;

            ViewBag.messageString = "ddCompanyList";

查看:

@Html.DropDownList("ddCompanyList")

4 个答案:

答案 0 :(得分:2)

您不应该在循环中引用列表companyList而不是单数项:

ddCompany.Add(new SelectListItem { Value = companyList.Company_ID, Text = companyList.Company });

应该是:

ddCompany.Add(new SelectListItem { Value = item.Company_ID, Text = item.Company });

我实际上建议如下:

ViewBag.ddCompany=leases.tblvCompanies
  .Select(c=>new SelectListItem {Value=c.Company_ID,Text=c.Company})
  .ToList();

虽然我通常不喜欢将UI元素(SelectListItem)从控制器传递到视图,但这是视图的责任。

答案 1 :(得分:1)

您可以尝试以下操作,而不是创建匿名类型吗?

var ddCompany = (from c in leases.tblvCompanies
                 select new SelectListItem{ Value = c.Company_ID, Text = c.Company })
                 .ToList();
ViewBag.ddCompany = ddCompany;

答案 2 :(得分:1)

为什么不使用强类型视图?您可以传递视图模型 为此目的在控制器和视图之间。像这样:

@model List<MvcApplication1.Models.SelectListItem>

@foreach(var item in Model)
{
   <span>@item.Value</span>
}

在视图中:

function disable_notifications( $disabled, $form, $lead )
{
  return true;
}

答案 3 :(得分:0)

您将匿名类型传递给您的视图,这对于您尝试执行的操作并非实际情况 - 匿名类型是作为内部生成的。您最好使用视图模型来传递数据,您将不再遇到这样的问题。