C# Razor页面路由-如何在下一页显示特定数据?
我在这本书里跟着读 我现在在第15章练习15.2中,我们的任务是创建一个Razor页面,生成按国家分组的客户列表。当您单击客户名称时,它会将您带到一个新页面,显示该客户的完整联系详细信息及其订单列表 书中基本上没有关于页面路由的练习或演示 我需要显示一个新页面,显示所点击客户的完整联系方式 在customers.cshtml页面中,我有C# Razor页面路由-如何在下一页显示特定数据?,c#,asp.net,razor,.net-core,C#,Asp.net,Razor,.net Core,我在这本书里跟着读 我现在在第15章练习15.2中,我们的任务是创建一个Razor页面,生成按国家分组的客户列表。当您单击客户名称时,它会将您带到一个新页面,显示该客户的完整联系详细信息及其订单列表 书中基本上没有关于页面路由的练习或演示 我需要显示一个新页面,显示所点击客户的完整联系方式 在customers.cshtml页面中,我有asp page=“./CustomerDetails”asp route id=“@customer.CustomerID”来捕获他们单击的对象。我陷入困境的是
asp page=“./CustomerDetails”asp route id=“@customer.CustomerID”
来捕获他们单击的对象。我陷入困境的是,如何将这些信息转换到新页面CustomerDetails.cshtml中,以便填充他们单击的客户
这可能不是一个路由问题,但因为我是新手,这是我最好的猜测
我尝试在顶部添加一个自定义路由约束@page“{CustomerID}”
,但它只是返回页面,因为我猜ID值没有传入
CustomerDetails.cshtml
@page“{CustomerID}”
@addTagHelper*,Microsoft.AspNetCore.Mvc.TagHelpers
@使用NorthwindEntitiesLib
@使用NorthwindWeb.Pages
@模型NorthwindWeb.Pages.CustomerDetailsModel
@{
ViewData[“Title”]=“客户详细信息”;
Layout=“~/Pages/Shared/_Layout.cshtml”;
}
客户详细信息
联系人姓名
公司:
标题:
电话号码:
传真:
@*待会整理成一张桌子*@
订单:
- 订单项目
CustomerDetails.cshtml.cs
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用System.Threading.Tasks;
使用Microsoft.AspNetCore.Mvc;
使用Microsoft.AspNetCore.Mvc.RazorPages;
使用Microsoft.CodeAnalysis.CSharp.Syntax;
使用Microsoft.EntityFrameworkCore;
使用Microsoft.EntityFrameworkCore.Metadata.Internal;
使用NorthwindContextLib;
使用NorthwindEntitiesLib;
名称空间NorthwindWeb.Pages
{
公共类CustomerDetailsModel:PageModel
{
私人北风数据库;
公共CustomerDetailsModel(Northwind injectedContext)
{
db=injectedContext;
}
公共IEnumerable客户{get;set;}
公共IActionResult OnGet(字符串id)
{
if(id==null)
{
返回NotFound();
}
Customers=db.Customers.Where(c=>c.CustomerID==id);
如果(客户==null)
返回NotFound();
返回页();
}
}
}
customer.cshtml(以备参考)
@page
@addTagHelper*,Microsoft.AspNetCore.Mvc.TagHelpers
@使用NorthwindEntitiesLib
@模型NorthwindWeb.Pages.CustomerModel
@{
ViewData[“Title”]=“客户”;
Layout=“~/Pages/Shared/_Layout.cshtml”;
}
客户
@foreach(模型中的var国家/地区。客户
.GroupBy(c=>c.Country)
.OrderBy(c=>c.Key))
{
@乡村,钥匙
@foreach(国家/地区的var客户。ToArray())
{
@customer.ContactName
}
}
这本书的作者更新了他的Github repo,将解决方案包括在内,我在将id拉到下一页时遗漏了什么,正如@pcalkins(不确定如何标记他!)所指出的
使用[BindProperty]可以将信息传输到页面,并正确设置OnGet()方法以确保传输ID。请参阅下面的解决方案。我还在Customer上设置了IEnumerable属性,因为我正在获取ID,所以不需要枚举它。还设置了保存我们正在获取的ID的属性
CustomerDetails.cshtml.cs
namespace NorthwindWeb.Pages
{
public class CustomerDetailsModel : PageModel
{
private Northwind db;
public CustomerDetailsModel(Northwind injectedContext)
{
db = injectedContext;
}
[BindProperty]
public Customer Customer { get; set; }
[BindProperty(SupportsGet = true)]
public String ID { get; set; }
public void OnGet()
{
Customer = db.Customers
.Where(c => c.CustomerID == ID)
.Include(c => c.Orders)
.ThenInclude(c => c.OrderDetails)
.ThenInclude(c => c.Product)
.FirstOrDefault();
}
}
}
在HTML页面上显示代码的部分片段
CustomerDetails.cshtml
@page
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@using NorthwindEntitiesLib
@model NorthwindWeb.Pages.CustomerDetailsModel
@{
ViewData["Title"] = "Customer Details";
Layout = "~/Pages/Shared/_Layout.cshtml";
}
<h1>Customer Details</h1>
<div class="card mb-3" style="max-width: 800px;">
<div class="row no-gutters">
<div class="col-md-4">
<img src="img/profile-placeholder.png" class="card-img" alt="...">
</div>
<div class="col-md-8">
<div class="card-body">
<h5 class="card-title">@Model.Customer.ContactName</h5>
<p class="card-text">Company: @Model.Customer.CompanyName</p>
<p class="card-text">Title: @Model.Customer.ContactTitle</p>
<p class="card-text">Phone Number: @Model.Customer.Phone</p>
<p class="card-text">Fax: @Model.Customer.Fax</p>
</div>
</div>
</div>
</div>
<div>
@page
@addTagHelper*,Microsoft.AspNetCore.Mvc.TagHelpers
@使用NorthwindEntitiesLib
@模型NorthwindWeb.Pages.CustomerDetailsModel
@{
ViewData[“Title”]=“客户详细信息”;
Layout=“~/Pages/Shared/_Layout.cshtml”;
}
客户详细信息
@Model.Customer.ContactName
公司:@Model.Customer.CompanyName
标题:@Model.Customer.ContactTitle
电话号码:@Model.Customer.Phone
传真:@Model.Customer.Fax
您想使用该模型。。。类似于@Html.DisplayNameFor(model=>model.Customers.FirstName)等。。。对于名称。。。和@Html.DisplayFor(model=>model.Customers.FirstName)等。。。对于数据。(虽然在.cs文件中似乎应该使用“Customer”而不是“Customers”……所以只需公开Customer Customer{get;set;}您在这里显示一个客户……然后使用@Html.DisplayFor(model=>model.Customer.FirstName)等……请参见“@model NorthwindWeb.Pages.CustomerDetailsModel”行…这使得公共客户可以作为“视图”模型使用。因此model.Customer.fieldname(s)顺便说一句,使用“bind”标记自动从post或get获取传入的VAR也更容易…:书籍作者回复了我的电子邮件,并向他的github帐户发布了一个解决方案。您对[bind]的看法是正确的属性!我将在下面发布我的解决方案,以便您和其他人可以看到我的解决方案
@page
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@using NorthwindEntitiesLib
@model NorthwindWeb.Pages.CustomersModel
@{
ViewData["Title"] = "Customers";
Layout = "~/Pages/Shared/_Layout.cshtml";
}
<div class="row">
<h1 class="display2">Customers</h1>
</div>
<div class="container">
<div class="row">
@foreach (var country in Model.Customers
.GroupBy(c => c.Country)
.OrderBy(c => c.Key))
{
<div class="card border-info mb-3 mr-3" style="width: 12rem">
<div class="card-header text-white bg-info">
@country.Key
</div>
<div class="list-group">
@foreach (var customer in country.ToArray())
{
<a asp-page="./CustomerDetails" asp-route-id="@customer.CustomerID"
class="list-group-item list-group-item-action">@customer.ContactName</a>
}
</div>
</div>
}
</div>
</div>
namespace NorthwindWeb.Pages
{
public class CustomerDetailsModel : PageModel
{
private Northwind db;
public CustomerDetailsModel(Northwind injectedContext)
{
db = injectedContext;
}
[BindProperty]
public Customer Customer { get; set; }
[BindProperty(SupportsGet = true)]
public String ID { get; set; }
public void OnGet()
{
Customer = db.Customers
.Where(c => c.CustomerID == ID)
.Include(c => c.Orders)
.ThenInclude(c => c.OrderDetails)
.ThenInclude(c => c.Product)
.FirstOrDefault();
}
}
}
@page
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@using NorthwindEntitiesLib
@model NorthwindWeb.Pages.CustomerDetailsModel
@{
ViewData["Title"] = "Customer Details";
Layout = "~/Pages/Shared/_Layout.cshtml";
}
<h1>Customer Details</h1>
<div class="card mb-3" style="max-width: 800px;">
<div class="row no-gutters">
<div class="col-md-4">
<img src="img/profile-placeholder.png" class="card-img" alt="...">
</div>
<div class="col-md-8">
<div class="card-body">
<h5 class="card-title">@Model.Customer.ContactName</h5>
<p class="card-text">Company: @Model.Customer.CompanyName</p>
<p class="card-text">Title: @Model.Customer.ContactTitle</p>
<p class="card-text">Phone Number: @Model.Customer.Phone</p>
<p class="card-text">Fax: @Model.Customer.Fax</p>
</div>
</div>
</div>
</div>
<div>