使用 ASP NET Core 2.0 Razor 页面进行路由
Posted
技术标签:
【中文标题】使用 ASP NET Core 2.0 Razor 页面进行路由【英文标题】:Routing using ASPNET Core 2.0 RazorPages 【发布时间】:2017-09-25 23:47:15 【问题描述】:这些年来我做了很多 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 路由的函数应该在索引页代码隐藏中才能被发现,还是我弄错了?
感谢您的帮助。
【问题讨论】:
那是因为您使用的是 Razor 页面,这是重新制作网络表单的失败尝试。使用完整的 MVC 套件,你会做得更好(Razor 页面仅支持单个 Get 和单个 Post 方法) 另请注意,在 Razor Pages 中,Controller 单词是未知的。 “控制器”是视图本身,所以如果你使用IndexController
你做错了什么
仅供参考,单个页面上支持多个获取和发布codingblast.com/asp-net-core-razor-pages-handlers
Razor 页面支持路由:mikesdotnetting.com/article/310/routing-in-razor-pages。而且它们并不是重新制作 Web 表单的失败尝试。该评论不准确且无益。现在推荐使用 Razor 页面而不是 MVC,这就是为什么它是 VS 2017 中默认的 ASP.NET Core 项目类型。
如果 Razor 页面是对任何东西的翻版,它就是旧的 .ashx 处理程序页面——具有许多新功能。 WebForms 很糟糕,但 MVVM 是一种合法的架构,Razor Pages 做得很好。
【参考方案1】:
您可以使用multiple handlers 做到这一点: 在你的代码隐藏中:
public class FooModel : PageModel
public void OnGet()
Trace.TraceInformation("Returns the page");
public IActionResult OnGetTest()
return new OkObjectResult( "Test" );
您可以通过请求调用测试函数:
GET foo?handler=test
.
此外,您可以配置page route 以使用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 );
【讨论】:
【参考方案2】:将其添加到.cshtml
页面顶部的页面指令中:
@page "ownerid/productid"
如果它们是int
s,那么还要添加该约束
@page "ownerid:int/productid:int?"
【讨论】:
【参考方案3】:我认为您正在寻找的是:
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 中的路线时朝着正确的方向前进。
【讨论】:
【参考方案4】:您看过页面处理程序吗?
你可以使用类似的东西:
<form method="GET">
<input asp-page-handler="Test">
</form>
public IActionResult OnGetTest()
【讨论】:
以上是关于使用 ASP NET Core 2.0 Razor 页面进行路由的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 asp.net core 2.0 Razor 页面执行下载操作
如何使用 Url.Action 在 asp.net core 2.0 razor 页面中传递多个操作
Razor Page–ASP.NET Core 2.0 新功能
如何在 ASP.NET Core 2.0 Razor 页面中填充下拉列表
我无法在 asp.net core 2.0 razor pages 中执行下载操作
ASP.NET Core 2.0/Razor Pages - 如何在请求之间将数据保存在 NonFactors MVC6 网格中?