【问题标题】:Routing using ASPNET Core 2.0 RazorPages使用 ASP NET Core 2.0 Razor 页面进行路由
【发布时间】: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 做得很好。

标签: c# asp.net-core-mvc asp.net-core-2.0 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}"
    

    如果它们是ints,那么还要添加该约束

    @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()
        {
        }
        

        【讨论】:

          猜你喜欢
          • 2020-12-21
          • 1970-01-01
          • 2019-12-20
          • 2018-09-05
          • 2019-05-22
          • 2020-04-03
          • 2019-11-22
          • 2020-01-04
          • 2020-05-06
          相关资源
          最近更新 更多