1

我在我的应用程序中定义了以下两条路由。强制控制器的mvc路由

 routes.MapRoute(
      "ApplicationRoutes", 
      "{language}-{country}/{userid}/{controller}/{action}/{id}", 
      new { language="en" , country="gb", id = UrlParameter.Optional } 
     ); 


     routes.MapRoute(
      "Default", 
      "{language}-{country}/{controller}/{action}/{id}", 
      new { language = "en", country = "gb", id = UrlParameter.Optional } 
     ); 

第一条路线将被捕获的URL像

  • EN-GB/11111 /目标/目录
  • EN-GB/11111 /目标/编辑/ 2

第二条路线是默认路线,将用于这样的事情

  • EN-GN /帐号/登录

我是我,我想以武力只被调用,如果他们通过applicationRoutes途径来某些控制器的问题。

例如我想确保目标控制器与routedata内的用户标识一起调用。

我知道我可以检查每个控制器的动作,如果用户标识键存在与路由数据中的值。但是这对我来说并不高雅。

我也可以更具体介绍一下路线,做这样的事情:

routes.MapRoute(
      "ApplicationRoutes", 
      "{language}-{country}/{userid}/Targets/{action}/{id}", 
      new { language="en" , country="gb", controller="targets", id = UrlParameter.Optional } 
     ); 

,但这不会直接停止请求EN-GB /目标/目录/无需提供用户ID值。

处理这个问题的最佳方法是什么?

回答

0

您可以为userid参数创建一个限制。

routes.MapRoute(
      "ApplicationRoutes", 
      "{language}-{country}/{userid}/{controller}/{action}/{id}", 
       new { language="en" , country="gb", id = UrlParameter.Optional }, 
       new { userid [email protected]"\d+" }); 

这将确保userid是一个有效的整数,否则下一个路由将用于处理请求。

+0

太好了。如果有一个控制器需要使用这个功能,那就完美了,但是可以说我拥有许多需要使用用户控制器的控制器。我可以按照您的指示为每个控制器实施特定的路线,但是是否有更优雅的解决方案来为每个控制器创建路线? – Kramer00

+0

对不起,我忘记了那里的控制器限制。您可以保持控制器变量不变。 –

+0

即使有限制,当然这不会阻止我进入/ en-gb/Targets/List,而不使用路由中的用户标识符,因为默认路由会处理这个问题。我想要确保在目标控制器上调用的每个操作都包含routedata中的用户标识。 – Kramer00