Razor 页面路由与 Web API 中的方式相同

Razor Page Routing in the same way as in Web API

我使用 Razor Pages 创建了一个 Web 应用程序。 我有 2 个具有一对多关系的模型:一个 List 可以容纳多个 Records.

  public class List
{
    public int ID { get; set; }

    [StringLength(25, MinimumLength = 3, ErrorMessage = "Title should be in range between 3 and 25")]
    [Display(Name = "Title")]

    public string Caption { get; set; }

    public string UserId { get; set; }
    public User User { get; set; }

    public ICollection<Record> Records { get; set; }
}

 public class Record
{
    public int ID { get; set; }
    [StringLength(25, MinimumLength = 3, ErrorMessage = "Word should be in range between 3 and 25")]
    [Display(Name = "Title")]

    public string Word { get; set; }
    [StringLength(30, MinimumLength = 3, ErrorMessage = "Translation should be in range between 3 and 30")]
    public string Translation { get; set; }

    public int ListId { get; set; }
    public List List { get; set; }
}

我需要提供从 List 项目到 Record 列表的导航,其方式与 Web API 或 MVC 中可能的方式类似。在 Microsoft 文档中,我找到了关于 attributes in Web Api 的页面,我需要的行为是:

[Route("customers/{customerId}/orders")]
public IEnumerable<Order> GetOrdersByCustomer(int customerId) { ... }

我需要这样的东西:

  [Microsoft.AspNetCore.Mvc.Route("Lists/{listId}/Records")]
    public async Task GetRecordsByList(int listId)
    {

        var allRecords = await _context.Record.ToListAsync();

        Record = allRecords.Where(w => w.ListId == listId).ToList() ;

    }

我确信可以提供从父模型 ListRecord 的子项目列表的导航。

UI 会是这样的: 从列表

导航到记录:

想要的URL应该是这样的:

我确定有人遇到过同样的问题并已解决! 如果有任何帮助或建议,我将不胜感激。

Razor Pages 默认使用属性路由。路由是从各个页面的文件路径生成的。您可以为路由指定参数,但您可以通过向 @page 指令添加路由模板来为特定页面执行此操作。

您显示的第一个页面可以是名为 Lists.cshtml 的页面或名为 Index.cshtml[=35= 的页面] 在 Lists 文件夹中。无论哪种方式,它都将使用默认路由在 domain.com/lists 处可用。第二个页面可以是名为 Details.cshtml 的页面,其覆盖路由模板为 "/Lists/{listid}/Records":

@page "/Lists/{listid}/Records"

或者您可以使用 Startup 中的 AddPageRoute 方法添加另一个可以到达索引页面的路由:

services.AddMvc().AddRazorPagesOptions(options =>
{
    options.Conventions.AddPageRoute("/Lists/Index", "Lists/{listid}/Records");
});

虽然这需要索引中的代码来确定它是否应该显示所有列表或选定列表的详细信息。

就我个人而言,我推荐第一种方法。在 Razor Pages 中,您的目标应该是让每个页面只负责一项职责。

在此处查看有关 Razor Pages 路由的更多信息:https://www.learnrazorpages.com/razor-pages/routing

基于 Mike Brind 答案的最终解决方案如下所示:

  1. 我将 Records 文件夹移到了 Lists 中:

  2. 从父级 Link 导航到记录的 Link 是这样定义的:

    详情

    页面 Lists/Records/Index 的
  1. URL 被重新定义为:

    @page "/Lists/{id}/Records"

  2. 方法 OnGetAsync 的签名已更改:int? id 现在可以为 null。

    public 异步任务 OnGetAsync(int?id) { ... }

现在 URL 看起来完全符合我的需要:

希望对大家有所帮助。