Razor 使用SQL查询下拉列表-ASP.NET Core 2.0;剃刀;VS 2017;实体框架核心

Razor 使用SQL查询下拉列表-ASP.NET Core 2.0;剃刀;VS 2017;实体框架核心,razor,entity-framework-core,asp.net-core-2.0,Razor,Entity Framework Core,Asp.net Core 2.0,我目前有一个ASP.NET Core 2.0 Web应用程序(从默认Web应用程序模板中内置VS 2017)。我有一个内置下拉菜单的RazorPage,我想通过SQL查询填充它。我使用Entity Framework Core构建了我的数据库模型,如下所示: public partial class INVOPEContext : DbContext { public virtual DbSet<PmeFundData> PmeFundData { g

我目前有一个ASP.NET Core 2.0 Web应用程序(从默认Web应用程序模板中内置VS 2017)。我有一个内置下拉菜单的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; }
    }
    @page
    @model pmepeModel
    @{
        ViewData["Title"] = "pmepe";
    }

    <select asp-for="dropdowns"
        id="firm" 
        class="dropdown" 
        asp-items= "@(new SelectList(ViewBag.ListofFirms, "Firm"))">
    </select>
public分部类INVOPEContext:DbContext
{
公共虚拟数据库集PmeFundData{get;set;}
HasAnnotation“Relational:DefaultSchema”,“Server\\User”);
modelBuilder.Entity(Entity=>
{
实体。ToTable(“PME_基金数据”、“dbo”);
entity.Property(e=>e.Firm).HasMaxLength(255);
});
}
公共部分类PmeFundData
{
公共字符串公司{get;set;}
}
我已经更新了RazorPage页面模型(pmepe.cshtml.cs),以包含DBContext和查询:

    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();
        }
    }
公共类pmepeModel:PageModel
{
私有只读INVOPEContext_db;
公共pmepeModel(INVOPEContext数据库)
{
_db=db;
}
公共IActionResult下拉列表()
{
List firmList=新列表();
firmList=(来自_db.PmeFundData中的Firm)
选择Firm).Distinct().ToList();
插入(0,新的PmeFundData{Firm=“All Firms”});
ViewBag.ListofFirms=firmList;
返回视图();
}
}
最后,带有下拉列表(pmepe.cshtml)的视图如下所示:

    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; }
    }
    @page
    @model pmepeModel
    @{
        ViewData["Title"] = "pmepe";
    }

    <select asp-for="dropdowns"
        id="firm" 
        class="dropdown" 
        asp-items= "@(new SelectList(ViewBag.ListofFirms, "Firm"))">
    </select>
@page
@模型pmepeModel
@{
ViewData[“Title”]=“pmepe”;
}

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

您的代码中存在多个问题

  • PmeFundData
    应该具有
    Id
    属性,否则,在运行
    updatedatabase
    命令时将收到错误

    public partial class PmeFundData
    {
    public int Id { get; set; }
    public string Firm { get; set; }
    }
    
  • RazorPage中不支持
    ViewBag
    ,您可以从中跟踪此问题,您可以尝试
    ViewData
    PageModel属性
    绑定对象

  • 下面是查看数据的一个简单代码

        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");
        }
    }
    
    公共类PmepeModelModel:PageModel
    {
    私有只读CoreRazor2_1.Data.ApplicationDbContext_上下文;
    公共PmepeModelModel(CoreRazor2_1.Data.ApplicationDbContext上下文)
    {
    _上下文=上下文;
    }
    公共IActionResult OnGet()
    {
    返回页();
    }
    [BindProperty]
    public int SelectedFirm{get;set;}
    [查看数据]
    公共IList ListofForms{get{
    返回下拉列表();
    }
    }
    公共IList下拉列表()
    {
    List firmList=新列表();
    firmList=新列表{
    新的PmeFundData{Id=1,Firm=“F1”},
    新的PmeFundData{Id=2,Firm=“F3”},
    新的PmeFundData{Id=3,Firm=“F2”}
    };
    //firmList=(来自_context.PmeFundData中的Firm)
    //选择Firm).Distinct().ToList();
    插入(0,新的PmeFundData{Firm=“All Firms”});
    返回列表;
    //ViewData[“ListOffrms”]=firmList;
    }
    公共异步任务OnPostAsync()
    {
    var值=选定的公司;
    如果(!ModelState.IsValid)
    {
    返回页();
    }
    _context.PmeFundData.Add(PmeFundData);
    wait_context.SaveChangesAsync();
    返回页首(“/索引”);
    }
    }
    
    看法

    @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");}
    }
    
    @page
    @模型CoreRazor2_1.Pages.PmepeModelModel
    @{
    ViewData[“Title”]=“PmepeModel”;
    }
    PmepeModel
    PmeFundData
    

    非常感谢您的快速回复。奇怪的是,当我输入你的代码时,我仍然在PageModel的[ViewData]上得到一条红色下划线。我在现有项目和新项目中都逐字尝试了您的代码。它告诉我找不到[ViewData]和crtl+。不会提示任何要添加的引用。你知道我为什么会丢失吗?对于
    ViewData
    属性,你需要从
    Asp.Net Core 2.1
    开始,如果你想处理
    Asp.Net Core 2.0
    ,我想你可以遵循这个[尝试
    BindProperty
    太好了!谢谢你。