【问题标题】:Creating dropdownlist from database with Entity Framework Core in an ASP.NET Core 5 MVC application在 ASP.NET Core 5 MVC 应用程序中使用 Entity Framework Core 从数据库创建下拉列表
【发布时间】:2021-11-06 18:36:37
【问题描述】:

在我的应用程序中,我试图通过使用 EF Core 从数据库中获取数据来填充下拉菜单,但不幸的是我已经尝试了两天没有成功。

我已尝试按照post 中的建议执行此操作,但我不断收到错误。

更具体地说,我现在面临的错误是

“IEnumerable”不包含“Years”的定义,并且找不到接受“IEnumerable”类型的第一个参数的可访问扩展方法“Years”

这个错误来自视图:

 @Html.DropDownList(m => m.Years, Model.Years, "-- Select year --")

这是我的模型类:

public partial class Bdgfixmonth
{
    public int Counter { get; set; }
    public int Byear { get; set; }

    //
    public IEnumerable<SelectListItem> Years { get; set; }

    public string Bbudget { get; set; }
    public int Bmonth { get; set; }
    public string Blongmonth { get; set; }
    public int Closed { get; set; }
    public string Current { get; set; }
}

这是我的 GET 操作方法 Index 的控制器:

private readonly salesContext _context;
public IEnumerable<SelectListItem> Years { get; set; }

public bdgfixmonthController(salesContext context)
{
    _context = context;
}

public async Task<IActionResult> Index()
{
    var bdgfixmonths = await _context.Bdgfixmonths.ToListAsync();

    IEnumerable<SelectListItem> GetAllYears()
    {
        IEnumerable<SelectListItem> list = _context.Bdgfixmonths
                .AsEnumerable()
                .Select(s => new SelectListItem
                {
                    Selected = false,
                    Text = s.Byear.ToString(),
                    Value = s.Byear.ToString()
                });
            
        return list;
    }

    Years = GetAllYears();

    return View(bdgfixmonths);
}

这里的目标是用 db 的数据填充下拉菜单,然后根据选择的值进行查询,以便只显示相关的值(在这种情况下基于年份)。

任何帮助将不胜感激,谢谢。

【问题讨论】:

  • 您好,我是指较新的 .NET 5。
  • 您也忘记设置模型的属性:bdgfixmonths.Years = GetAllYears()
  • 是的,抱歉,我现在包含了变量声明。

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


【解决方案1】:

由于您要返回一个包含Bdgfixmonths 列表的模型,因此最好创建一个如下所示的视图模型:

public class BdgfixmonthsViewModel
{
   public List<Bdgfixmonth> Bdgfixmonths { get; set; }
   public IEnumerable<SelectListItem> Years { get; set; }
}

然后,您的 Action Method 将更改为:

private readonly salesContext _context;

public bdgfixmonthController(salesContext context)
{
    _context = context;
}

public async Task<IActionResult> Index()
{
    var vm = new BdgfixmonthsViewModel();
    var bdgfixmonths = await _context.Bdgfixmonths.ToListAsync();

    IEnumerable<SelectListItem> GetAllYears()
    {
        IEnumerable<SelectListItem> list = _context.Bdgfixmonths
                .AsEnumerable()
                .Select(s => new SelectListItem
                {
                    Selected = false,
                    Text = s.Byear.ToString(),
                    Value = s.Byear.ToString()
                });
            
        return list;
    }

    vm.Years = GetAllYears();
    vm.Bdgfixmonths = bdgfixmonths; 

    return View(vm);
}

您的 ViewModel 将拥有两个可在视图中使用的集合。您将需要更新视图以引用 Bdgfixmonth 属性,例如 Bdgfixmonths.Bbudget。此外,模型将更改为:

@model IEnumerable<Bdgfixmonth>

变成

@model BdgfixmonthsViewModel

然后任何迭代代码将更改为:

@foreach (var item in Model.Bdgfixmonths)
    {
      item.Bbudget
    }

【讨论】:

  • 年 = GetAllYears();不起作用,错误消息是“‘List’不包含‘Years’的定义,并且找不到接受‘List’类型的第一个参数的可访问扩展方法‘Years’(你是缺少 using 指令或程序集引用?)。“
  • @chdev - 我的错,刚刚注意到您返回了Bdgfixmonths 的集合,我现在将更改我的答案。
  • 是的,但因为我是新手,所以我需要一个最低限度的声誉才能让我的支持出现。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-08
  • 1970-01-01
  • 2019-02-26
  • 2021-04-04
  • 2017-07-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多