2017-09-25 137 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); 
    }