2

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

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

3 回答 3

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" });
于 2013-04-06T22:04:27.790 回答
1

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

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

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

Wim 的方法也有效。

于 2013-04-07T04:36:41.337 回答
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 */
    }
}
于 2013-04-06T20:00:57.157 回答