【问题标题】:Create nice url in asp.net core 3在 asp.net core 3 中创建漂亮的 url
【发布时间】:2020-10-03 12:26:49
【问题描述】:

我想要一个如下所示的 URL:

如果 artCatId != null 并且 tagId == null:

/Article/artCatId/100/pageNumber/2

如果 artCatId == null 并且 tagId != null:

/Article/tagId/200/pageNumber/3

如果 artCatId != null 和 tagId != null:

/Article/artCatId/100/tagId/200/pageNumber/3

我怎样才能创建这个漂亮的 URL?

我在我的项目中使用了 ASP.NET Core 3.1。

在控制器中:

public async Task<IActionResult> Index(int? artCatId = null, int? tagId = null, int pageNumber = 1)
{

}

在 Startup.cs 中:

app.UseEndpoints(endpoints =>
{
    // This doesn't work based on my expectation
    endpoints.MapControllerRoute(name: "article cat or tag", pattern: "{controller=Article}/{action}/artCatId/{artCatId?}/tagId/{tagId?}/pageNumber/{pageNumber}");
}

【问题讨论】:

    标签: c# asp.net-core url url-routing asp.net-core-3.0


    【解决方案1】:

    一种选择是将多个RouteAtrributes 放在一个方法上:

    [Route("Article/artCatID/{artCatId:int}/tagId/{tagId:int}/pageNumber/{pageNumber:int}")]
    [Route("Article/artCatID/{artCatId:int}/pageNumber/{pageNumber:int}")] 
    [Route("Article/tagId/{tagId:int}/pageNumber/{pageNumber:int}")] 
    public IActionResult Article(int? artCatId = null, int? tagId = null, int pageNumber = 1)
    { 
       // logic to handle based on passed in values
    } 
    

    【讨论】:

      【解决方案2】:

      您可以在控制器中处理所有这些。

      我在 .net 核心应用程序中完成了这项工作,并测试了所有符合您规范的 URL 路由。

      [Route("/Home/Article/ArtCatID/{artCatId:int}/TagId/{tagId:int}/PageNumber/{pageNumber:int}")]
              public IActionResult Article(int? artCatId = null, int? tagId = null, int pageNumber = 1)
              {
                  //Do some Code here
                  return View();
              }
              [Route("/Home/Article/ArtCatID/{artCatId:int}/PageNumber/{pageNumber:int}")]
              public IActionResult Article(int? artCatId = null, int pageNumber = 1)
              {
                  //Do some Code here
                  return View();
              }
              [Route("/Home/Article/TagId/{tagId:int}/PageNumber/{pageNumber:int}")]
              public IActionResult Article(int? tagId = null, int pageNumber = 1, string placeHolder = "")
              {
                  //Do some Code here
                  return View();
              }
      

      这将处理上述三种情况。启动时不需要路由映射,它也可以工作。您将需要三个文章方法,但我认为这实际上很好,因为您将根据 URL 获得不同的结果

      【讨论】:

      • 可以组合成一个重载并粘贴多个 Route 属性,每个属性都使用正确的语法指定可选和非可选值。否则,(如果在此处使用 hrm 路由)您可能需要重命名方法本身(即具有更具描述性的名称),因为 mvc 可能最终会出现模棱两可的匹配并引发异常并无法路由跨度>
      • 你可以,但我认为看到它们扩展会有所帮助。由于 URL 中有硬编码的名称,因此我不会路由失败,因此我更担心的是输入错误而不是模棱两可的匹配。所以理想情况下,我想这些 URL 很可能会以编程方式生成。
      猜你喜欢
      • 2013-05-25
      • 1970-01-01
      • 1970-01-01
      • 2012-07-20
      • 2014-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多