我正在尝试在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 }
);
}
答案 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 */
}
}