多年来我做了很多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}路由的函数应该在索引页面代码隐藏中才能找到,或者我错了?
感谢您的帮助。
答案 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 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?}" );
} );
}
您可以使用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中的路线,这可以让你朝着正确的方向前进。