下拉列表未填充来自3个单独参考表的数据

时间:2016-01-15 21:52:13

标签: c# asp.net asp.net-mvc asp.net-core-mvc entity-framework-core

目前我正在使用EF7与ASP.Net MVC 6合作。我正在使用默认控制器生成器。由于某些原因,即使存在数据,我的下拉也不会填充创建或编辑页面上的数据。

只是为了澄清3个选择列表由3个不同的表填充,这些表都连接到我要添加的主表。

这是我得到的。

控制器代码

ps ax | grep ruby
#=> 857 pts/19     Sl+    0:04 /home/andreydeineko/.rvm/rubies/ruby-2.2.3/bin/ruby bin/rails server
#=> 14639 pts/18   S+     0:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn rails
#=> 25368 pts/17   Sl+    0:02 /home/andreydeineko/.rvm/rubies/ruby-2.2.3/bin/ruby bin/rails c
kill -9 857
ps ax | grep ruby
#=> 14639 pts/18   S+     0:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn rails
#=> 25368 pts/17   Sl+    0:02 /home/andreydeineko/.rvm/rubies/ruby-2.2.3/bin/ruby bin/rails c

查看代码

private readonly SchoolContext _context;

public SchoolsController(SchoolContext context)
{
    _context = context;    
}

public IActionResult Create()
{
   ViewData["DistrictId"] = new SelectList(_context.Districts, "DistrictId", "District");
   ViewData["LocationId"] = new SelectList(_context.Locations, "LocationId", "Location");
   ViewData["TierId"] = new SelectList(_context.Tiers, "TierId", "Tier");
   return View();
}

包含在顶部,这是select元素之一

@model School

选择列表完全空白,没有数据存在错误。

这都是自动生成的,所以我完全不知道出了什么问题。有什么建议吗?

2 个答案:

答案 0 :(得分:1)

假设您的视图名称为School(ViewModel的约定是视图的名称+“ViewModel”)

class SchoolViewModel
{
    IEnumerable<SelectListItem> Districts;
    IEnumerable<SelectListItem> Locations;
    IEnumerable<SelectListItem> Tiers;
}

然后在你看来,

@model SchoolViewModel
...
@Html.DropDownList("Districts", m=>m.Districts, "-- Select--")
@Html.DropDownList("Locations", m=>m.Locations, "-- Select--")
@Html.DropDownList("Tiers", m=>m.Tiers, "-- Select--")

在您的控制器中

public IActionResult Create()
{
    var vm = new SchoolViewModel();
    vm.Districts = _context.Districts.Select(d => new
    {
        Text = d.District,
        Value = d.DistrictId.ToString()
    };

    //repeat for others...

    return View(vm);
}

答案 1 :(得分:1)

您需要绑定到(所选值)的属性和选项的属性,并且它们需要具有不同的名称。理想情况下,您应该使用具有(例如)

的视图模型
public class SchoolVM
{
  public int DistrictId { get; set; }
  public IEnumerable<SelectListItem> DistrictList { get; set; }
  ....

和GET方法

public IActionResult Create()
{
  SchoolVM model = new SchoolVM
  {
    DistrictList = new SelectList(_context.Districts, "DistrictId", "District"),
    .....
  };
  return View(model);
}

并在视图中

@model SchoolVM
....
<select asp-for="DistrictId" asp-items="Model.DistrictList"></select>

或者,您可以使用ViewBagViewData并使用

<select asp-for="DistrictId" asp-items="ViewBag.DistrictList"></select>