2016-11-08 52 views
0

我在控制器匿名列表DropDownListFor

public ActionResult Create() 
{ 
    ViewBag.CustomerList = new SelectList(db.Customers.Select(m => new { Id = m.Id, m.Name, m.LastName })); 
    return View(); 
} 

,并在视图

@Html.DropDownListFor(model => model.Customer.Id, (SelectList)ViewBag.CustomerList, "", new { @class = "form-control" }) 

,但在浏览器中写了这个代码,我得到这样的结果在下拉

ResultPic

我该如何解决这个问题?

回答

0

变化,则控制器代码这个

 ViewBag.CustomerList = new SelectList(db.Customers.Select(m => new SelectListItem { Value = m.Id.ToString(), Text = m.Name + " " + m.LastName }), "Value", "Text"); 
0

克雷亚一个ViewModel:

public class CreateViewModel 
{ 
    public List<Customer> Customers { get; set; } 
    public int SelectedId { get; set; } 
} 

在控制器:

public ActionResult Create() 
{ 
    var model = new CreateViewModel(); 
    model.Customers = db.Customers.TolIst(); 

    return View(model); 
} 

上查看:

@Html.DropDownListFor(model => Selected.Id, new SelectList(
      Model.Customers, 
      "Id", 
      "Name", 
      Model.SelectedId)) 
+0

,谢谢你的回答,但我不想创建模型,可以做这个工作就像我的做法? – mic

1

的问题是,你是不是传递成员名称值和文本的选择列表。默认情况下,它将尝试分别使用名称分别为ValueText的成员,这是匿名对象不具有的成员。如果不这样做,那么它只需在列表中的每个项目上调用ToString,并将其用于值和文本,这当然是在这里发生的。

因此,最简单的解决方法是简单地传递代表委员字符串使用的价值和文本PARAMS:

ViewBag.CustomerList = new SelectList(db.Customers.Select(m => new { Id = m.Id, m.Name, m.LastName }), "Id", "Name"); 

然而,更好的办法是在所有和使用不选择到一个匿名对象SelectListItem代替:

ViewBag.CustomerList = new SelectList(db.Customers.Select(m => new SelectListItem { Value = m.Id.ToString(), Text = m.Name + " " + m.LastName })); 

你会发现这也为您提供了Concat的的NameLastName值加在一起的能力,而其他方法只允许您选择一个或 另一个。

+0

你为你的答案我改变控制器代码ViewBag.CustomerList = new SelectList(db.Customers.Select(m => new SelectListItem {Value = m.Id.ToString(),Text = m.Name +“”+ m 。姓 }));但结果我得到System.Web.Mvc.SelectListItem选项,我怎么能解决这个问题? – mic

+0

有趣。当我传递一个'IEnumerable '时,我可以发誓'SelectList'处理所有东西,但显然不是。你可以1)做一些类似'new SelectList(...,“Value”,“Text”)'或者2)根本不需要创建一个'SelectList',只需要传递'Select'直接到'Html.DropDownListFor'调用。 Razor将自动处理创建'SelectList'。 –