在ASP.NET MVC中对默认控制器上的操作进行路由

时间:2012-08-18 04:11:33

标签: asp.net-mvc-3 asp.net-routing

我有一个默认路由,所以如果我去www.domain.com/app/,那就是HomeController。我对控件有另一个动作,例如helloworld但是如果我去www.domain.com/app/helloworld它就会失败,而404(毫无疑问是期待helloworld控制器)。

如何在默认控制器上进行非默认操作?如何将url / app / helloworld映射到helloworld操作。我的路由如下:

routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);

routes.MapRoute( //this fails with same 404 like it does when it's ommitted
"Hello", // Route name
"app/helloworld", // URL with parameters
new { controller = "Home", action = "HellowWorld", id = UrlParameter.Optional } // Parameter defaults
);

基本上我需要:

/ app / => Controller = Home,Action = Index

/ app / helloworld => Controller = Home,Action = HelloWorld, 不是Controller = HelloWorld,Action - Index

/ app / other => Controller = Other,Action = Index

2 个答案:

答案 0 :(得分:2)

将Global文件中的2 routes替换为:

routes.MapRoute(
    "Default", // Route name
    "App/{controller}/{action}/{id}", // URL with parameters
    new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
    );

然后验证您的HomeController是否包含:

public ActionResult Index()
{
    return View();
}

public ActionResult HelloWorld()
{
    return View();
}

这样做是yoursite.com/app/ANYCONTROLLER/ANYACTION将路由到控制器和操作(只要它们存在),默认new { controller = "Home", action = "Index"意味着如果有人前往yoursite.com/app/它将会自动路由到yoursite.com/app/Home/Index

如果这不起作用,请尝试删除app/,使其显示如下:

routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}/{id}", // URL with parameters
    new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);

你看起来像是试图路由yoursite.com/Home/Index,而第二条路线的措辞是错误的,我不确定它会做什么,但不是"app/helloworld它应该看起来像{{ 1}}然后"app/HelloWorld/{action}/{id}"会起作用。如果有人前往new { controller = "Home", action = "HellowWorld",它会自动显示yoursite.com/app。希望有助于澄清一些事情。

这是您想要的答案

出于某种原因,您不想为hello world部分创建新控制器,yoursite.com/app/Home/HelloWorld文件中的RegisterRoutes应如下所示:

Global

虽然我不建议这样做。

答案 1 :(得分:0)

你应该只需要一条路线。而不是对操作进行硬编码,使其成为变量,但包括默认值:

routes.MapRoute( //this fails with same 404 like it does when it's ommitted
    "Hello", // Route name
    "app/{action}", // URL with parameters
    new { controller = "Home", action = "HelloWorld", id = UrlParameter.Optional } 
);

这样,当您转到 www.domain.com/app/ 时,它将获得默认操作(HelloWorld)。但您仍然可以在 www.domain.com/app/someotheraction 中指定路线中的操作。

另外,请记住选择了第一条匹配路线...因此您应该考虑将默认路线移至末尾,或将其完全删除。在示例 www.domain.com/app/helloworld 中,它与默认路由匹配 app 作为控制器, helloworld 作为操作(这当然是无效的,因此404)。