razor - 使用 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 文件 - 所以我无法让它在我的应用程序中工作。您可以提供的任何帮助将不胜感激。
解决方案
您的代码中有多个问题。
PmeFundData
应该有属性,否则,你会在运行命令Id
时收到错误。update-database
public partial class PmeFundData { public int Id { get; set; } public string Firm { get; set; } }
ViewBag
RazorPage 不支持,您可以从Add ViewBag 到 PageModel #6754跟踪此问题,您可以尝试ViewData
或PageModel 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 Page
从ASP.NET Core 中的 Razor 页面简介中学习
推荐阅读
- php - CKeditor表单问题将帖子添加到数据库
- linux - 显示名称中包含空格的文件大小
- iis - 如何在应用程序池回收期间关闭文件
- android - 领域模型不是此领域架构的一部分
- css - 设计不同的警报结果?
- ios - iOS 音乐库:如何判断给定的播放列表是否为文件夹
- reactjs - 将 MobX 状态树存储注入反应组件抛出错误
- r - 在R中使用正则表达式的某个字符串模式之后的所有第一个数字
- javascript - 如何从 Cloud Function 访问存储在 Firestore 中的 DocumentReference 对象?
- javascript - 单击当前标记时删除其他标记