2017-09-25 147 views
1

多年来,我已经做了相当多的ASP.NET API编程,但对于.NET Core和RazorPages来说,这是非常新的。我似乎无法让路由正常工作。使用ASPNET核心2.0的路由RazorPages

例如,我有一个索引页。 OnGet正常工作,如预期的那样,它返回Razor定义的页面。现在,我想补充的另一种方法,我们称之为测试索引页代码隐藏,像这样:

[Route("Test")] 
public void Test() 
{ 
    Console.WriteLine("Test"); 
} 

现在对于我的生活,我不能访问这条路线,既不是本地主机/索引/测试或本地主机/测试或者我能想到的任何其他错综复杂的路线。这是设计吗? localhost和localhost/index都返回默认的get方法。

这引起了我相当多的地方,我想在一个漂亮的URL中使用的所有者和产品ID显示产品的详细信息,像这样的麻烦:

products/{ownerid}/{productid} 

正如上面提到的,我不能图到这个自定义漂亮的URL。如果我理解正确,映射到{ownerid}/{productid}路由的函数应该位于索引页代码隐藏中以便找到,或者我误会了吗?

谢谢你的帮助。

+1

那是因为你使用的剃刀的页面,这是一次失败的尝试在重塑webforms。使用完整的MVC套件,你会好得多(Razor页面只支持单个获取和单个Post方法) –

+0

另请注意,在Razor Pages中,控制器字是未知的。 “控制器”就是视图本身,所以如果你使用的是“IndexController”,那么你做错了什么。 –

+0

控制器部分是一个错字,我的意思是页面。我明白你的意思。他们谈论了如此多的MVC背景,它从未跨过我的思维路线可能不被支持。感谢您解决这个问题。 – JasonX

回答

0

你看看页面处理程序吗?

您可以使用类似:

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

public IActionResult OnGetTest() 
{ 
} 
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中的路线。在您的代码隐藏 :

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 routeGET foo/test调用它。你可以用@页指令做在foo.cshtml文件:

@page "{handler?}" 
@model FooModel 
@{ 
    ViewData["Title"] = "Foo"; 
} 
<h2>Foo</h2> 

或者你可以在启动加航线。CS

public void ConfigureServices(IServiceCollection services) 
    { 
     services 
     .AddMvc() 
     .AddRazorPagesOptions(options => 
     { 
      options.Conventions.AddPageRoute("/foo", "foo/{handler?}"); 
     }); 
    } 

同样的方式,您可以添加一条路由与parmeters:

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

,并在代码隐藏:

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