在Asp.Net MVC中配置我的路由

时间:2017-09-22 19:04:31

标签: asp.net-mvc asp.net-mvc-routing asp.net-mvc-controller

我正在尝试配置我的路线,以便它反映用户在页面中的标签。照片如下。 如果州处于“即将到来”状态,我希望只有一条路线,状态=即将到来,没有月份或年份

  

www.mysite.com/Schedule/Host/Upcoming

如果州是“过去”,我需要像这样需要一个月和一年

  

www.mysite.com/Schedule/Host/Past/March/2016

问题是我只能进入控制器和动作

  

附表/主机

并且路线进入动作方法。我想阻止这个。

这里有一些例子

  

www.mysite.com/Schedule/Host - >没有通过控制器和动作

     

www.mysite.com/Schedule/Host/Upcoming - >没有月份或年份的确定

     

www.mysite.com/Schedule/Host/Past/March/2016 - >当state = past你必须提供一个月和一年

以下是将Upcoming作为状态

的页面
  

https://localhost:44368/Schedule/Host/Upcoming

enter image description here

以下是状态

的情况
  

https://localhost:44368/Schedule/Host/Past/March/2017

enter image description here

这是我的路由

public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "ScheduleByState",
            url: "{controller}/{action}/{state}/{month}/{year}",
            defaults: new { month = UrlParameter.Optional, year = UrlParameter.Optional}
        );

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );


    }

这是我的操作方法Host

public ActionResult Host(string state, string month, string year)
{
    ViewBag.MenuItem = "schedule";
    ViewBag.UserMenuItem = "host";
    return View();
}

1 个答案:

答案 0 :(得分:0)

不确定我是否理解你的问题

但似乎您必须设置多条路线才能满足您的要求

routes.MapRoute(
            name: "home",
            url: "{controller}/{action}/"
            }
        );    

routes.MapRoute(
            name: "ScheduleByState",
            url: "{controller}/{action}/Upcoming/"
           }
        );


routes.MapRoute(
            name: "ScheduleByState",
            url: "{controller}/{action}/Past/{month}/{year}"
           }
        );

另一个解决方案是在你的路由器参数中使用正则表达式,它会使事情变得更复杂,所以如果你只有这些固定状态,可能会有更多的规则更容易处理