无法在Razor中显示Lambda中的SelectList值

时间:2016-07-29 19:20:10

标签: asp.net-mvc razor

在MVC中。

尝试在Razor中显示dropDownList时收到此错误消息。

  

DataBinding:'System.Int32'不包含名为'BranchId'的属性。

在观察窗口中,我可以看到包含BranchIdBranchName的数据库正在返回1条记录 我没有引用Model类中的SelectList

在Controller类

var list = new SelectList(db.Branchs.Where(branches => !db.CompanyBranches
    .Any(d => d.BranchId == branches.BranchId))
    .Select(branches => branches.BranchId).ToList(), 
    "BranchId", "BranchNumber");
ViewBag.Branch = new SelectList(list);

在Create.cshtml中

@Html.DropDownList("Branch", new SelectList(ViewBag.Branch, "BranchID", "BranchName"), htmlAttributes: new { @class = "form-control" })

感谢Stephen

我按照你的建议改变了我的CompanyBranchesController中的lambda表达式   就是现在   var list = db.Branchs.Where(branches =>!db.CompanyBranches                                      .Any(d => d.BranchId == branches.BranchId))                                      .Select(b => new {BranchId = b.BranchId,BranchName = b.BranchName})。ToList();

下拉列表的Create.cshtml是  @ Html.DropDownList(“Branch”,ViewBag.Branch为IEnumerable,htmlAttributes:new {@class =“form-control”})

下拉列表中的结果是 {BranchId = 5,BranchNumber = Br0003}

我一直在玩它,包括添加到CompanyBranchController  List items = new List();                 foreach(列表中的var i)                 {                     SelectListItem s = new SelectListItem();                     s.Text = i.BranchName.ToString();                     s.Value = i.BranchId.ToString();                     items.Add(一个或多个);
                }

除了尝试不同的剃刀表情,但没有成功。

我出错的任何想法?

2 个答案:

答案 0 :(得分:1)

查看代码的这一部分( SelectList构造函数

Select(branches => branches.BranchId).ToList()

您正在选择branchId。所以基本上你将整数列表传递给SelectList构造函数。但是您指定BranchId是数据值字段。但整数没有这样的属性。

因此,您应该将Select更改为具有此属性的匿名类型

Select(b => new { BranchId = b.BranchId, BranchNumber = b.BranchId).ToList()

分配给ViewBag时,您不需要再次创建另一个SelectList。所以这很好

ViewBag.Branch = list;

并在您看来,

 @Html.DropDownList("Branch", ViewBag.Branch as IEnumerable<SelectListItem>, 
                                         htmlAttributes: new { @class = "form-control" })

甚至更轻松,您只需将商品转换为SelectListItem

列表即可
var list= db.Branchs.Where( // Put your where clause here)
            .Select(branches => new SelectListItem { Value = branches.BranchId.ToString(),
                                       Text = branches.BranchId.ToString()}).ToList();
ViewBag.Branch = list;

答案 1 :(得分:0)

您的代码是正确的,只是在我添加的CompanyBranchContoller中

List<SelectListItem> items = new List<SelectListItem>();
                foreach (var i in list)
                {
                    SelectListItem s = new SelectListItem();
                    s.Text = i.BranchName.ToString();
                    s.Value = i.BranchId.ToString();
                    items.Add(s);                    
                }

ViewBag.Branch = items;

然后在Create.cshtml类中,我将对下拉列表的引用更改为您的建议:

 @Html.DropDownList("Branch", ViewBag.Branch as IEnumerable<SelectListItem>, htmlAttributes: new { @class = "form-control" })

感谢你的所有帮助Stephen