.Net Core 3.1 下拉列表显示现有数据
.Net Core 3.1 Dropdown list to show existing data
如您所知,我是 Web 编程的相对初学者 - 从使用 VB 编写的 Web 窗体 (ASPX) 开始。我的入门项目正在 Visual Studio 代码(最新版本)中开发为使用 .Net Core 3.1 的 Razor 页面,据我所知,这是现在最直接的方法。 (我避免了完整的 Visual Studio,因为这是一个小项目,我不能要求我的组织为此付费,而且微软很清楚社区版本不适用于 "Enterprises",正如它定义我们的那样。)我用 Basic、Pascal 和 Perl 编写过代码,但不是一个本能的程序员。自从 "Classic ASP" 以来,Web 应用程序的复杂性在我看来增加了十倍,并且现在要求将元素分为 View、Model 和 ViewModel。
根据在线示例,我已经让我的应用程序写入(种子数据)并从 MySQL 数据库中读取。然而,部分视图打败了我。我已经尝试了各种如何创建和填充下拉列表的示例,但是 none 将编译或 运行 因为缺少元素,即使在 运行ning "dotnet add package" 和添加对相关命名空间的引用。
尽管我的应用程序仅在 Windows 上 运行,但我决定不想要组合框,因为它很耗资源(即使添加了必要的组件,我的应用程序也无法编译)引用并尝试重建。)我与标签助手和 HTML 助手纠缠不清,并遇到了一系列不同的错误。我没有尝试过包括 "Viewbag" 在内的例子,因为我找不到关于它是什么的清晰描述,而且至少有一个消息来源建议不要使用它。
然后我觉得我把事情搞得太复杂了,因为我的应用程序已经成功读取了下拉列表中所需的数据,如附图所示。它位于模型 (Home.cshtlml.cs) 中,使用 BookIt_Context.cs 和代表 PC.cs 和 Location.cs 中的两个 table 的实体。如图所示,我的样本数据可用并且可以显示在 table(对于 PC)和位置的纯文本(地名列表 运行 一起在顶部)。但是,尝试各种其他技术来显示下拉列表时,不断出现错误,告诉我 "Name" 不在模型中(尽管它显然在模型中)。
现在编译错误已经消失,但位置的下拉列表仍然顽固地空白。谁能告诉我为什么? Location中的数据(public List Location {get; set; } = new List();
) 需要在下拉列表中显示某种类型转换?抱歉,如果我错过了一些简单的东西,但我就是看不到它。Screen shot
@page
@model HomeModel // Definition of this lives in the corresponding .cs file
@{
ViewData["Title"]="BookIt Home";
}
<section id="main">
@foreach(var loc in Model.Location) { @loc.Name }
<br>
<select name="OurLoc" id="OurLocBox">
@foreach(var loc in Model.Location) { <option value="@loc.Name"></option> }
</select>
<table border="1" cellspacing="10" cellpadding="10">
<tr> <!-- Header row -->
<td><p><b>PC Name</b></p></td><td><p><b>Location</b></p></td><td><p><b>Workstn Name</b></p></td>
</tr>
@foreach(var pc in Model.PC)
{
<tr>
<td><p>@pc.FriendlyName</p></td> <td><p>@pc.LocationID</p></td> <td><p>@pc.NetBIOSName</p></td>
</tr>
}
</table>
</section>
Home.cshtml.cs:
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using Pomelo.EntityFrameworkCore.MySql;
using Microsoft.AspNetCore.Mvc.RazorPages;
using BookIt.Data;
using BookIt.Models;
namespace BookIt.Pages
{
public class HomeModel : PageModel
{
private readonly BookIt_Context db;
public HomeModel(BookIt_Context db) => this.db = db;
public List<PC> PC {get; set; } = new List<PC>();
public List<Location> Location {get; set; } = new List<Location>();
public async Task OnGetAsync()
{
PC = await db.PC.ToListAsync();
Location = await db.Location.ToListAsync();
}
}
}
您已经为 DropDownList 项目设置了值,但没有为它们的文本设置值。
@foreach(var loc in Model.Location)
{
<option value="@loc.Name">@loc.Name</option>
}
如您所知,我是 Web 编程的相对初学者 - 从使用 VB 编写的 Web 窗体 (ASPX) 开始。我的入门项目正在 Visual Studio 代码(最新版本)中开发为使用 .Net Core 3.1 的 Razor 页面,据我所知,这是现在最直接的方法。 (我避免了完整的 Visual Studio,因为这是一个小项目,我不能要求我的组织为此付费,而且微软很清楚社区版本不适用于 "Enterprises",正如它定义我们的那样。)我用 Basic、Pascal 和 Perl 编写过代码,但不是一个本能的程序员。自从 "Classic ASP" 以来,Web 应用程序的复杂性在我看来增加了十倍,并且现在要求将元素分为 View、Model 和 ViewModel。
根据在线示例,我已经让我的应用程序写入(种子数据)并从 MySQL 数据库中读取。然而,部分视图打败了我。我已经尝试了各种如何创建和填充下拉列表的示例,但是 none 将编译或 运行 因为缺少元素,即使在 运行ning "dotnet add package" 和添加对相关命名空间的引用。
尽管我的应用程序仅在 Windows 上 运行,但我决定不想要组合框,因为它很耗资源(即使添加了必要的组件,我的应用程序也无法编译)引用并尝试重建。)我与标签助手和 HTML 助手纠缠不清,并遇到了一系列不同的错误。我没有尝试过包括 "Viewbag" 在内的例子,因为我找不到关于它是什么的清晰描述,而且至少有一个消息来源建议不要使用它。
然后我觉得我把事情搞得太复杂了,因为我的应用程序已经成功读取了下拉列表中所需的数据,如附图所示。它位于模型 (Home.cshtlml.cs) 中,使用 BookIt_Context.cs 和代表 PC.cs 和 Location.cs 中的两个 table 的实体。如图所示,我的样本数据可用并且可以显示在 table(对于 PC)和位置的纯文本(地名列表 运行 一起在顶部)。但是,尝试各种其他技术来显示下拉列表时,不断出现错误,告诉我 "Name" 不在模型中(尽管它显然在模型中)。
现在编译错误已经消失,但位置的下拉列表仍然顽固地空白。谁能告诉我为什么? Location中的数据(public List Location {get; set; } = new List(); ) 需要在下拉列表中显示某种类型转换?抱歉,如果我错过了一些简单的东西,但我就是看不到它。Screen shot
@page
@model HomeModel // Definition of this lives in the corresponding .cs file
@{
ViewData["Title"]="BookIt Home";
}
<section id="main">
@foreach(var loc in Model.Location) { @loc.Name }
<br>
<select name="OurLoc" id="OurLocBox">
@foreach(var loc in Model.Location) { <option value="@loc.Name"></option> }
</select>
<table border="1" cellspacing="10" cellpadding="10">
<tr> <!-- Header row -->
<td><p><b>PC Name</b></p></td><td><p><b>Location</b></p></td><td><p><b>Workstn Name</b></p></td>
</tr>
@foreach(var pc in Model.PC)
{
<tr>
<td><p>@pc.FriendlyName</p></td> <td><p>@pc.LocationID</p></td> <td><p>@pc.NetBIOSName</p></td>
</tr>
}
</table>
</section>
Home.cshtml.cs:
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using Pomelo.EntityFrameworkCore.MySql;
using Microsoft.AspNetCore.Mvc.RazorPages;
using BookIt.Data;
using BookIt.Models;
namespace BookIt.Pages
{
public class HomeModel : PageModel
{
private readonly BookIt_Context db;
public HomeModel(BookIt_Context db) => this.db = db;
public List<PC> PC {get; set; } = new List<PC>();
public List<Location> Location {get; set; } = new List<Location>();
public async Task OnGetAsync()
{
PC = await db.PC.ToListAsync();
Location = await db.Location.ToListAsync();
}
}
}
您已经为 DropDownList 项目设置了值,但没有为它们的文本设置值。
@foreach(var loc in Model.Location)
{
<option value="@loc.Name">@loc.Name</option>
}