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

标签 c# asp.net asp.net-mvc asp.net-web-api-routing razor-pages

我使用 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 将是这样的: 从列表 enter image description here

导航到记录: enter image description here

所需的 URL 应该是这样的:

enter image description here

我相信有人遇到过同样的问题并解决了这个问题! 如果有任何帮助或建议,我将不胜感激。

最佳答案

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

您显示的第一个页面可以是 Lists 文件夹中名为 Lists.cshtml 的页面或名为 Index.cshtml 的页面.无论哪种方式,它都将使用默认路由在 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

关于c# - Razor 页面路由与 Web API 中的方式相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52863354/

相关文章:

c# - 在应用程序中实现本地密码

c# - 如何以编程方式访问焦点元素 WPF C#

c# - 在 C# 中查找图像中的颜色

c# - 找到直线和三次样条之间的交点

asp.net - ASP .Net WorldPay 集成

c# - 如何在 ASP.NET Core 中将我的服务注册拆分成不同的文件?

asp.net-mvc - edmx 重建会创建一个重复的设计器 cs 文件

html - 背景图像不时变化时的文本可见性问题

c# - 检查动态创建的文本框是否被 Javascript 弄脏

asp.net-mvc - ASP MVC 尝试从字符串模型加载布局