在 asp.net 核心 3 中创建漂亮的 url

Create nice url in asp.net core 3

我想要一个 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}");
}

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

我已在 .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

获得不同的结果

一个选项是将多个 RouteAtrribute 放在一个方法上:

[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
}