C# Razor页面路由-如何在下一页显示特定数据?

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”来捕获他们单击的对象。我陷入困境的是

我在这本书里跟着读

我现在在第15章练习15.2中,我们的任务是创建一个Razor页面,生成按国家分组的客户列表。当您单击客户名称时,它会将您带到一个新页面,显示该客户的完整联系详细信息及其订单列表

书中基本上没有关于页面路由的练习或演示

我需要显示一个新页面,显示所点击客户的完整联系方式

在customers.cshtml页面中,我有
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>