Razor 使用SQL查询下拉列表-ASP.NET Core 2.0;剃刀;VS 2017;实体框架核心
我目前有一个ASP.NET Core 2.0 Web应用程序(从默认Web应用程序模板中内置VS 2017)。我有一个内置下拉菜单的RazorPage,我想通过SQL查询填充它。我使用Entity Framework Core构建了我的数据库模型,如下所示: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
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; }
}
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
太好了!谢谢你。