使用ASPNET Core 2.0 RazorPages进行路由

Jas*_*onX 4 c# asp.net-core-mvc asp.net-core-2.0 razor-pages

多年来我做了很多ASP.NET API编程,但对.NET Core和RazorPages来说还是一个新手.我似乎无法让路由正常工作.

例如,我有一个索引页面.OnGet工作正常,正如预期的那样,它返回Razor定义的页面.现在我添加另一个方法,让我们将其称为Test到Index页面的代码隐藏,如下所示:

[Route("Test")]
public void Test()
{
    Console.WriteLine("Test");
}
Run Code Online (Sandbox Code Playgroud)

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

这在我尝试使用漂亮网址中的所有者和产品ID显示产品详细信息时遇到了相当大的麻烦,如下所示:

products/{ownerid}/{productid}
Run Code Online (Sandbox Code Playgroud)

如上所述,我无法映射到此自定义漂亮网址.如果我理解正确,映射到{ownerid}/{productid}路由的函数应该在索引页面代码隐藏中才能找到,或者我错了?

谢谢您的帮助.

Bor*_*sni 7

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

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

    public IActionResult OnGetTest()
    {
        return new OkObjectResult( "Test" );
    }
}
Run Code Online (Sandbox Code Playgroud)

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

@page "{handler?}"
@model FooModel
@{
    ViewData["Title"] = "Foo";
}
<h2>Foo</h2>
Run Code Online (Sandbox Code Playgroud)

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

public void ConfigureServices(IServiceCollection services)
    {
        services
        .AddMvc()
        .AddRazorPagesOptions( options =>
        {
            options.Conventions.AddPageRoute( "/foo", "foo/{handler?}" );
        } );
    }
Run Code Online (Sandbox Code Playgroud)

您可以使用参数添加路径的方式相同:

options.Conventions.AddPageRoute( "/foo", "products/{ownerId}/{productId}" );
Run Code Online (Sandbox Code Playgroud)

并在代码隐藏中:

public void OnGet( string productId, string ownerId)
    {
        Trace.TraceInformation("IDs: {0}, {1}", productId, ownerId );
    }
Run Code Online (Sandbox Code Playgroud)


cau*_*ita 0

你看过页面处理程序吗?

你可以使用类似的东西:

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

public IActionResult OnGetTest()
{
}
Run Code Online (Sandbox Code Playgroud)