【问题标题】:Dropdownlists not populating with data from 3 separate reference tables下拉列表未填充来自 3 个单独的参考表的数据
【发布时间】:2016-04-21 14:27:51
【问题描述】:

目前我正在使用 EF7 处理 ASP.Net MVC 6。我正在使用默认的控制器生成器。由于某种原因,即使存在数据,我的下拉菜单也没有填充创建或编辑页面上的数据。

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

这就是我得到的。

控制器代码

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

查看代码

@model School

包含在顶部,这里是选择元素之一的样子

<div class="form-group">
        <label asp-for="DistrictId" class="col-md-2 control-label"></label>
        <div class="col-md-10">
            <select asp-for="DistrictId" class ="form-control"></select>
        </div>
    </div>

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

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

【问题讨论】:

  • 什么是School?它是您的 ViewModel 还是实体?你为什么使用ViewData 而不是你的School 类?
  • School 是包含这些字段的 3 个 ID 的数据实体,它们来自 3 个导航属性表。我使用 ViewData 的原因是我从这 3 个单独的表中发送信息,所以我有名称而不仅仅是填充列表的 ID。
  • 您必须为此使用 ViewModel。你熟悉这种模式吗?
  • 您可以在帖子中添加学校实体吗?您需要视图或 ViewModel 的模型。顺便说一句,在您看来,我没有看到正在使用的 School 模型。
  • 好的,我没有 ViewModel 设置。不知道需要这样做才能正常运行。我会尝试设置它。您是要我为学校添加模型吗?

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


【解决方案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>

【讨论】:

  • 这实际上导致我的应用程序崩溃。 EntityFramework.Core.dll 中出现“System.InvalidOperationException”类型的异常,但未在用户代码中处理附加信息:实体类型“Microsoft.AspNet.Mvc.Rendering.SelectListGroup”需要定义一个键。
  • 显然是公共 IEnumerable DistrictList { get;放; } 不应该是我的 EF 模型的一部分。
  • 我将这些语句移至视图模型以更正此问题。
  • 不,不应该——这就是为什么它是一个视图模型(而不是一个数据模型)
  • 你说得对,我将它们放在控制器而不是视图模型中。谢谢!
【解决方案2】:

假设您的视图名称是 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);
}

【讨论】:

    猜你喜欢
    • 2019-12-20
    • 1970-01-01
    • 2023-03-19
    • 2020-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-16
    相关资源
    最近更新 更多