4

这些年来我已经完成了一些 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} 路由的函数应该在索引页面代码隐藏中以便被发现,还是我弄错了?

谢谢您的帮助。

4

4 回答 4

8

您可以使用多个处理程序:在您的代码隐藏中:

public class FooModel : PageModel
{
    public void OnGet()
    {
        Trace.TraceInformation("Returns the page");
    }

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

您可以使用 request: 调用 Test 函数 GET foo?handler=test
此外,您可以配置一个页面路由来调用它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 );
    }
于 2017-11-10T00:41:25.960 回答
2

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

@page "{ownerid}/{productid}"

如果它们是ints 则还添加该约束

@page "{ownerid:int}/{productid:int?}"
于 2018-07-25T14:05:21.810 回答
0

你看过页面处理程序吗?

你可以使用类似的东西:

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

public IActionResult OnGetTest()
{
}
于 2017-09-26T01:57:37.847 回答
0

我认为您正在寻找的是:

产品.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 中的路线时朝着正确的方向前进。

于 2017-10-18T16:04:25.050 回答