在显示特定操作时,使用MVC路由覆盖控制器名称

时间:2013-04-06 18:26:14

标签: asp.net-mvc asp.net-mvc-4

我正在尝试在MVC4中指定一个路由,如果显示特定的操作名称,则忽略控制器名称。例如。

mysite.com/AnyControllerNameHere/SpecificAction - 让我指定要使用的控制器和操作

mysite.com/AnyControllerNameHere/NotSpecificAction - 将带我的AnyControllerNameHere Controller和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 }
        );
    }

3 个答案:

答案 0 :(得分:5)

当你这样写:

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

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

所需要的是设置控制器参数的路由模板,以便默认生效:

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

答案 1 :(得分:1)

最简单的方法是使用Route约束。

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

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

Wim的方法也适用。

答案 2 :(得分: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 */
    }
}