首页 > 解决方案 > 使用 SQL 查询进行下拉 - ASP.NET Core 2.0;剃刀页面;与 2017 年相比;实体框架核心

问题描述

我目前有一个 ASP.NET Core 2.0 Web 应用程序(在 VS 2017 中使用默认 Web 应用程序模板构建)。我有一个内置下拉列表的 RazorPage,我想通过 SQL 查询来填充它。我使用 Entity Framework Core 构建了我的数据库模型,如下所示:

    public partial class INVOPEContext : DbContext
    {
        public virtual DbSet<PmeFundData> PmeFundData { get; set; }

            modelBuilder.HasAnnotation"Relational:DefaultSchema", "Server\\User");

            modelBuilder.Entity<PmeFundData>(entity =>
            {
                entity.ToTable("PME_FUND_DATA", "dbo");
                entity.Property(e => e.Firm).HasMaxLength(255);
            });
    }


    public partial class PmeFundData
    {
        public string Firm { get; set; }
    }

我更新了 RazorPage PageModel (pmepe.cshtml.cs) 以包含 DBContext 和 Query:

    public class pmepeModel : PageModel
    {
        private readonly INVOPEContext _db;
        public pmepeModel(INVOPEContext db)
        {
            _db = db;
        }

        public IActionResult dropdowns()
        {
            List<PmeFundData> firmList = new List<PmeFundData>();

            firmList = (from Firm in _db.PmeFundData
                        select Firm).Distinct().ToList();

            firmList.Insert(0, new PmeFundData {Firm = "All Firms" });

            ViewBag.ListofFirms = firmList;

            return View();
        }
    }

最后,带有下拉列表的视图(pmepe.cshtml)如下:

    @page
    @model pmepeModel
    @{
        ViewData["Title"] = "pmepe";
    }

    <select asp-for="dropdowns"
        id="firm" 
        class="dropdown" 
        asp-items= "@(new SelectList(ViewBag.ListofFirms, "Firm"))">
    </select>

我收到错误,即在 PageModel 的当前上下文中既不存在 ViewBag 也不存在 View(视图中没有错误 - Intellisense 将其拾取)。我在网上找到的每个示例都是针对 MVC 而不是 RazorPages。通常为 MVC 提供的解决方案是将查询嵌入到 Controller 中并在 web.config 文件中调整 MVC 版本。但是 RazorPages 模板没有控制器,我找不到 web.config 文件 - 所以我无法让它在我的应用程序中工作。您可以提供的任何帮助将不胜感激。

标签: razorentity-framework-coreasp.net-core-2.0

解决方案


您的代码中有多个问题。

  1. PmeFundData应该有属性,否则,你会在运行命令 Id时收到错误。update-database

    public partial class PmeFundData
    {
    public int Id { get; set; }
    public string Firm { get; set; }
    }
    
  2. ViewBagRazorPage 不支持,您可以从Add ViewBag 到 PageModel #6754跟踪此问题,您可以尝试ViewDataPageModel Property绑定该对象。

这是一个简单的代码ViewData

    public class PmepeModelModel : PageModel
{
    private readonly CoreRazor2_1.Data.ApplicationDbContext _context;

    public PmepeModelModel(CoreRazor2_1.Data.ApplicationDbContext context)
    {
        _context = context;
    }

    public IActionResult OnGet()
    {
        return Page();
    }
    [BindProperty]
    public int SelectedFirm { get; set; }
    [ViewData]
    public IList<PmeFundData> ListofFirms { get {
            return Dropdowns();
        }
    }
    public IList<PmeFundData> Dropdowns()
    {
        List<PmeFundData> firmList = new List<PmeFundData>();
        firmList = new List<PmeFundData> {
            new PmeFundData{ Id = 1, Firm = "F1"},
            new PmeFundData{ Id = 2, Firm = "F3"},
            new PmeFundData{ Id = 3, Firm = "F2"}
        };
        //firmList = (from Firm in _context.PmeFundData
        //            select Firm).Distinct().ToList();

        firmList.Insert(0, new PmeFundData { Firm = "All Firms" });
        return firmList;
        //ViewData["ListofFirms"] = firmList;
    }

    public async Task<IActionResult> OnPostAsync()
    {
        var value = SelectedFirm;
        if (!ModelState.IsValid)
        {
            return Page();
        }

        _context.PmeFundData.Add(PmeFundData);
        await _context.SaveChangesAsync();

        return RedirectToPage("./Index");
    }
}

看法

@page
@model CoreRazor2_1.Pages.PmepeModelModel

@{
    ViewData["Title"] = "PmepeModel";
}

<h2>PmepeModel</h2>
<h4>PmeFundData</h4>
<hr />
<div class="row">
    <div class="col-md-4">
        <form method="post">
            <select asp-for="@Model.SelectedFirm"
                    class="dropdown"
                    asp-items="@(new SelectList((IEnumerable<PmeFundData>)@ViewData["ListofFirms"], "Id" ,"Firm"))">

            </select>
            <div class="form-group">
                <input type="submit" value="Create" class="btn btn-default" />
            </div>
        </form>
    </div>
</div>
<div>
    <a asp-page="Index">Back to List</a>
</div>

@section Scripts {
    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}

您还可以Razor PageASP.NET Core 中的 Razor 页面简介中学习


推荐阅读