使用ASPNET Core 2.0 RazorPages进行路由

时间:2017-09-25 23:47:16

标签: 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");
}

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

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

products/{ownerid}/{productid}

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

感谢您的帮助。

4 个答案:

答案 0 :(得分:5)

您可以使用multiple handlers执行此操作: 在你的代码隐藏中:

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

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

您可以通过请求调用Test函数: GET foo?handler=test
此外,您可以配置page routeGET 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?}" );
        } );
    }

您可以使用parmeter添加路线:

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

和代码隐藏:

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

答案 1 :(得分:2)

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

@page "{ownerid}/{productid}"

如果它们是int,则还要添加该约束

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

答案 2 :(得分:0)

您是否看过页面处理程序?

您可以使用以下内容:

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

public IActionResult OnGetTest()
{
}

答案 3 :(得分:0)

我认为你在寻找的是:

<强> 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中的路线,这可以让你朝着正确的方向前进。