使用 ASP NET Core 2.0 Razor 页面进行路由

Posted

技术标签:

【中文标题】使用 ASP NET Core 2.0 Razor 页面进行路由【英文标题】:Routing using ASPNET Core 2.0 RazorPages 【发布时间】:2017-09-25 23:47:15 【问题描述】:

这些年来我做了很多 ASP.NET API 编程,但对 .NET Core 和 RazorPages 还是很陌生。我似乎无法让路由正常工作。

例如,我有一个索引页面。 OnGet 工作正常,正如预期的那样,它返回 Razor 定义的页面。现在我添加另一个方法,我们称它为 Test to the Index page codebehind,如下所示:

[Route("Test")]
public void Test()

    Console.WriteLine("Test");

现在对于我的生活,我无法通过 localhost/Index/Test 或 localhost/Test 或任何其他我能想到的复杂路线访问这条路线。这是设计使然吗? localhost 和 localhost/index 都返回默认的 get 方法。

这给我带来了很多麻烦,我试图在漂亮的 URL 中使用所有者和产品 ID 显示产品的详细信息,如下所示:

products/ownerid/productid

如上所述,我无法映射到这个自定义的漂亮 URL。如果我理解正确,映射到 ownerid/productid 路由的函数应该在索引页代码隐藏中才能被发现,还是我弄错了?

感谢您的帮助。

【问题讨论】:

那是因为您使用的是 Razor 页面,这是重新制作网络表单的失败尝试。使用完整的 MVC 套件,你会做得更好(Razor 页面仅支持单个 Get 和单个 Post 方法) 另请注意,在 Razor Pages 中,Controller 单词是未知的。 “控制器”是视图本身,所以如果你使用 IndexController 你做错了什么 仅供参考,单个页面上支持多个获取和发布codingblast.com/asp-net-core-razor-pages-handlers Razor 页面支持路由:mikesdotnetting.com/article/310/routing-in-razor-pages。而且它们并不是重新制作 Web 表单的失败尝试。该评论不准确且无益。现在推荐使用 Razor 页面而不是 MVC,这就是为什么它是 VS 2017 中默认的 ASP.NET Core 项目类型。 如果 Razor 页面是对任何东西的翻版,它就是旧的 .ashx 处理程序页面——具有许多新功能。 WebForms 很糟糕,但 MVVM 是一种合法的架构,Razor Pages 做得很好。 【参考方案1】:

您可以使用multiple handlers 做到这一点: 在你的代码隐藏中:

public class FooModel : PageModel

    public void OnGet()
    
        Trace.TraceInformation("Returns the page");
    

    public IActionResult OnGetTest()
    
        return new OkObjectResult( "Test" );
    

您可以通过请求调用测试函数: GET foo?handler=test. 此外,您可以配置page route 以使用GET foo/test 调用它。您可以使用 @page 指令在 foo.cshtml 文件中执行此操作:

@page "handler?"
@model FooModel
@
    ViewData["Title"] = "Foo";

<h2>Foo</h2>

或者你可以在Startup.cs中添加路由:

public void ConfigureServices(IServiceCollection services)
    
        services
        .AddMvc()
        .AddRazorPagesOptions( options =>
        
            options.Conventions.AddPageRoute( "/foo", "foo/handler?" );
         );
    

使用参数添加路由的方法相同:

options.Conventions.AddPageRoute( "/foo", "products/ownerId/productId" );

在代码隐藏中:

public void OnGet( string productId, string ownerId)
    
        Trace.TraceInformation("IDs: 0, 1", productId, ownerId );
    

【讨论】:

【参考方案2】:

将其添加到.cshtml 页面顶部的页面指令中:

@page "ownerid/productid"

如果它们是ints,那么还要添加该约束

@page "ownerid:int/productid:int?"

【讨论】:

【参考方案3】:

我认为您正在寻找的是:

Products.cshtml

@pages "ownerId" // note this part! very important!
@using Microsoft.AspNetCore.Mvc.RazorPages
@model ProductsModel

@functions 
    public class ProductsModel : PageModel
    
        public void OnGet(string ownerId) // pass the string
        
            // your code here
        
    


<div>...</div>

然后这将映射到http://localhost/products/ownerid

我希望这能让你在处理 RazorPages 中的路线时朝着正确的方向前进。

【讨论】:

【参考方案4】:

您看过页面处理程序吗?

你可以使用类似的东西:

<form method="GET">
    <input asp-page-handler="Test"> 
</form>

public IActionResult OnGetTest()


【讨论】:

以上是关于使用 ASP NET Core 2.0 Razor 页面进行路由的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 asp.net core 2.0 Razor 页面执行下载操作

如何使用 Url.Action 在 asp.net core 2.0 razor 页面中传递多个操作

Razor Page–ASP.NET Core 2.0 新功能

如何在 ASP.NET Core 2.0 Razor 页面中填充下拉列表

我无法在 asp.net core 2.0 razor pages 中执行下载操作

ASP.NET Core 2.0/Razor Pages - 如何在请求之间将数据保存在 NonFactors MVC6 网格中?