C# 使用ASPNET Core 2.0 RazorPages进行路由

C# 使用ASPNET Core 2.0 RazorPages进行路由,c#,asp.net-core-mvc,asp.net-core-2.0,razor-pages,C#,Asp.net Core Mvc,Asp.net Core 2.0,Razor Pages,这些年来,我已经做了很多ASP.NET API编程,但是我对.NET核心和RazorPages非常陌生。我似乎无法使路由正常工作 例如,我有一个索引页。OnGet工作正常,正如预期的那样,它返回Razor定义的页面。现在,我添加了另一个方法,我们将其称为Test,用于索引页面codebehind,如下所示: [Route("Test")] public void Test() { Console.WriteLine("Test"); } products/{ownerid}/{prod

这些年来,我已经做了很多ASP.NET API编程,但是我对.NET核心和RazorPages非常陌生。我似乎无法使路由正常工作

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

[Route("Test")]
public void Test()
{
    Console.WriteLine("Test");
}
products/{ownerid}/{productid}
现在,就我的一生而言,我无法通过localhost/Index/Test或localhost/Test或我能想到的任何其他复杂的路由访问此路由。这是故意的吗?localhost和localhost/index都返回默认的get方法

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

[Route("Test")]
public void Test()
{
    Console.WriteLine("Test");
}
products/{ownerid}/{productid}
如上所述,我无法映射到这个定制的漂亮URL。如果我理解正确,映射到{ownerid}/{productid}路由的函数应该在索引页codebehind中才能找到,还是我弄错了


谢谢您的帮助。

您看过页面处理程序了吗

您可以使用以下内容:

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

public IActionResult OnGetTest()
{
}

公共IActionResult OnGetTest()
{
}

我想你要找的是:

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>
@pages“{ownerId}”//注意这部分!非常重要!
@使用Microsoft.AspNetCore.Mvc.RazorPages
@模型产品模型
@功能{
公共类ProductsModel:PageModel
{
public void OnGet(string ownerId)//传递字符串
{
//你的代码在这里
}
}
}
...
这将映射到
http://localhost/products/{ownerid}

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

您可以使用以下工具: 在您的代码隐藏中:

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

    public IActionResult OnGetTest()
    {
        return new OkObjectResult( "Test" );
    }
}
public void OnGet( string productId, string ownerId)
    {
        Trace.TraceInformation("IDs: {0}, {1}", productId, ownerId );
    }
您可以通过请求调用测试函数:
GET foo?handler=test

此外,您还可以将配置为使用
GET foo/test
调用它。您可以使用@page指令在foo.cshtml文件中执行此操作:

@page "{handler?}"
@model FooModel
@{
    ViewData["Title"] = "Foo";
}
<h2>Foo</h2>
与添加带有参数的管线的方法相同:

options.Conventions.AddPageRoute( "/foo", "products/{ownerId}/{productId}" );
在代码背后:

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

    public IActionResult OnGetTest()
    {
        return new OkObjectResult( "Test" );
    }
}
public void OnGet( string productId, string ownerId)
    {
        Trace.TraceInformation("IDs: {0}, {1}", productId, ownerId );
    }

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

@page "{ownerid}/{productid}"
如果它们是
int
s,则也添加该约束

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

这是因为您使用的是Razor页面,这是一次失败的尝试,试图重新创建webforms。使用完整的MVC套件,您会得到更好的结果(Razor页面只支持一个Get和一个Post方法),同时请注意,在Razor页面中,控制器单词是未知的。“控制器”是视图本身,因此,如果您使用的是
IndexController
,那么您做的是错误的。请注意,在单个页面上支持多个Get和post。Razor页面中支持路由:。而且他们并不是一次失败的尝试,试图重新制作Web表单。这一评论是不准确和无益的。现在推荐使用Razor pages而不是MVC,这就是为什么它是VS 2017中默认的ASP.NET核心项目类型。如果Razor pages是任何东西的翻版,那么它就是旧的.ashx处理程序页面,具有许多新功能。WebForms很糟糕,但MVVM是一种合法的体系结构,Razor Pages在这方面做得相当好。