2013-04-06 52 views
2

我试图指定一个路径在MVC4忽略控制器名称,如果提供一个特定的操作名称。例如。使用MVC路由覆盖控制器名称时提出了具体行动

mysite.com/AnyControllerNameHere/SpecificAction - 会让我指定控制器和操作使用,同时

mysite.com/AnyControllerNameHere/NotSpecificAction - 会带我的的AnyControllerNameHere控制器和NotSpecificAction方法类似MVC默认。

我试图编码的东西,但它似乎并没有做我想做的事情。全航线的配置仅仅是MVC默认加我试图这样做,所以...

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

     routes.MapRoute(
      "SpecificAction", 
      "{controller}/SpecificAction", 
      new { controller = "Home", action = "SpecificAction" } 
      ); 


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

路由声明的顺序很重要。如果你的''SpecificAction''在**默认路由声明之前**,它应该工作。所以请你完整的路线配置! – nemesv 2013-04-06 18:36:23

+0

所以是唯一的方法来做到这一点把SpecificAction放在{controller}之前?我可以让它工作,但这不是我想要做的。 – 2013-04-06 18:52:15

+0

你期望它做什么与默认路由选择不同?你已经明确地告诉它在第一条路线上去了SpecificAction,所以它会完成默认路由在同一个场景中做的事情......你确定它没有按照你想要的方式工作吗? – 2013-04-06 19:13:48

回答

4

当你这样写:

routes.MapRoute(
    "SpecificAction", 
    "{controller}/SpecificAction", 
    new { controller = "Home", action = "SpecificAction" }); 

您打算重写控制器。但是,第三个参数不能用于覆盖的参数。它仅为默认值提供任何尚未由URL提供的参数。

所以,你需要的是一个路线模板,设置控制器参数,使默认生效:

routes.MapRoute(
    name: "SpecificAction", 
    url: "{ignored}/SpecificAction", 
    defaults: new { controller = "Home", action = "SpecificAction" }); 
+0

谢谢,这正是我想要的,并且很容易理解。 – 2013-04-08 16:37:31

0

我不认为这可以用MVC内置的路由可以轻松实现。你可以考虑写一个自定义的路由处理,或者做类似下面有默认路由做这份工作适合你:

public class BaseController : Controller 
{ 
    public ActionResult SpecificAction() 
    { 
     return RedirectToAction("SpecificAction", "Home"); 
    } 
} 

public class SomeController : BaseController 
{ 
    /* ... */ 
} 

public class HomeController : BaseController 
{ 
    public override ActionResult SpecificAction() 
    { 
     /* Do whatever */ 
    } 
} 
0

要做到这一点是使用一个路由约束的最简单方法。

routes.MapRoute(
    "SpecificAction", 
    "{anyController}/{specificAction}", 
    new {controller="Home", action="SpecificAction"}, 
    new {specificAction = "SpecificAction" } 
); 

这里的关键是,你不使用默认的{控制器}和{}的行动,而是不同的东西(它们可以是任何东西),但使用路由约束将其锁定到SpecificAction行动。

Wim的方法也适用。

相关问题