我想要一个看起来像这样的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}");
}
一个选项是将多个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
}
您可以在控制器中处理所有这一切。
我已经在.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您将获得不同的结果