2017-09-22 100 views
0

我想配置我的路线,以便它反映用户在页面内的标签。下面的图片。 如果状态是“即将”我想只是与状态=路线中即将像这样没有一个月或一年配置我的路线在Asp.Net MVC

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 /计划/主机/过去/月/ 2016 - >当状态=过去,你必须提供一个年份和月份

下面是该网页将会是什么样即将作为国家

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 } 
     ); 


    } 

这里是我的操作方法主机如果

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

字符串是可为空的类型。您需要在操作方法级别处理参数值检查。你也可以考虑使用适当的类型(int为月和年) – Shyju

回答

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}" 
      } 
     ); 

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