使用SQL Query for Dropdown-ASP.NET Core 2.0;RazorPages;与2017年相



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

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.cs.html.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.cs.html(的视图如下:

@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提供的解决方案是将查询嵌入控制器中,并在web.config文件中调整MVC版本。但是RazorPages模板没有控制器,我也找不到web.config文件,所以我无法在我的应用程序中使用它。如果您能提供任何帮助,我们将不胜感激。

您的代码中存在多个问题。

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

    public partial class PmeFundData
    {
    public int Id { get; set; }
    public string Firm { get; set; }
    }
    
  2. RazorPage中不支持ViewBag,您可以从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");}
}

您还可以从ASP.NET Core 中的Razor Pages简介中学习Razor Page

最新更新