DropDownListFor的匿名列表

时间:2016-11-08 15:47:24

标签: asp.net asp.net-mvc

我在控制器中编写了这段代码

df = df2.loc[df2.groupby(['ANIMAL','AGE_Y'])['AGE_D'].idxmin()]
df = df[['ANIMAL','AGE_Y','AGE_D']]
print (df)
   ANIMAL  AGE_Y  AGE_D
0       1      1      3
3       1      2    377
5       2      1      1

并在视图中

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

但是在浏览器中,我在下拉列表中得到了这个结果

ResultPic

如何解决此问题?

3 个答案:

答案 0 :(得分:1)

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

因此,最简单的解决方法是简单地传递表示成员的字符串以用于值和文本参数:

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 }));

您会注意到这也使您能够将NameLastName值连在一起,而另一种方法只允许您选择其中一种。

答案 1 :(得分: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))

答案 2 :(得分:0)

将控制器代码更改为此

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