带有GET参数的.net核心自定义路由

时间:2018-07-25 06:54:46

标签: c# .net asp.net-core asp.net-mvc-routing mvcroutehandler

.Net Core MVC,采用如下自定义路由:

App.UseMvc(routes =>
{
  routes.MapRoute(
  name: "fantasyBoardArea",
  //constraints: "{area=FantasyDraftBoard}/{controller=Test}/{league?}/{id}",
                  template: "{area=FantasyDraftBoard}/{leagueName?}/{controller=Test}/{action=Index}/{search?}");
});

是否可以通过某种方式进行设置,如果上述路径中的{leagueName}是4个字符串之一(NHL,NFL,NBA,MLB),那么我希望它使用典型的路径(区域/ controller / action /(queryParamters),但是还在我的控制器上使用LeagueName作为路由参数吗?我不介意看起来像"domainname.com/FantasyDraftBoard/NHL/Controller/Action/"的路由URL。是“索引”操作的“索引”

例如:

[Area("FantasyDraftBoard")]
public class TestController : Controller
{      
    public async Task<IActionResult> Index(string leagueName, string search)
    {
       if(!String.IsNullOrEmpty(leagueName)
       {
           //do something
       }
       //Code removed, not important
    }

如果 leagueName 与这四个字符串之一不匹配,那么我希望将其忽略并将其视为常规控制器/操作路线。

注意-在顶部忽略我的路线中的约束,这只是为了测试和尝试。

有想法吗?

1 个答案:

答案 0 :(得分:0)

  app.UseMvc(routes =>
        {
            routes.MapRoute(
                        "New",
                        "{area:exists}/{leagueName?}/{controller}/{action}/{id?}",
                        new { leagueName= "NHL", controller = "Default", action = "Index" },
                        new { leagueName= "NHL|NFL" }
                    );
            routes.MapRoute(
                name: "areaRoute",
                template: "{area:exists}/{controller=Home}/{action=Index}/{id?}");

            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });

   [Area("FantasyDraftBoard")]
   public class DefaultController : Controller
   {
    public IActionResult Index(string leagueName)
    {
        return View();
    }
   }

我验证了LeagueName设置为其中一个值。

编辑: 如果该值不存在,则联赛名称设置为NULL,但如果包含的值不是4,则返回404