C# 使用ASPNET Core 2.0 RazorPages进行路由
这些年来,我已经做了很多ASP.NET API编程,但是我对.NET核心和RazorPages非常陌生。我似乎无法使路由正常工作 例如,我有一个索引页。OnGet工作正常,正如预期的那样,它返回Razor定义的页面。现在,我添加了另一个方法,我们将其称为Test,用于索引页面codebehind,如下所示: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
[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在这方面做得相当好。