ASP.NET MVC 3控制器的路线 - 让

问题描述:

目前在HomeController的一切都出现在URL作为ASP.NET MVC 3控制器的路线 - 让

example.com/Home/{Action} 

域下下家控制器一切似乎有,我们可以将所有其他路由事情是这样的一种方式但只有特殊情况下的家庭控制器,所以家中的所有东西都在域名下。

example.com/about 
example.com/contact 
example.com/error 

,而不是为他们每个人创造新的控制器类。

编辑:

其他网址的喜欢

example.com/user/details/123 
example.com/user/edit/123 

这是在UserController中应该工作一样,他们现在

+0

routes.MapRoute(“Default”,“{action}”,new {controller =“Home”,action =“{action}”}); –

我认为最好的方法是:

routes.MapRoute("home", "home", new { controller = "Home", action = "Index" }); 
routes.MapRoute("about", "about", new { controller = "Home", action = "About" }); 
routes.MapRoute("contact", "contact", new { controller = "Home", action = "Contact" }); 

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

,当你想创建一个链接,使用:

@Html.RouteLink("Home", "home", new{/* route values */}, new {/* html attribues */}) 

OR:

@Html.RouteLink("Home", "home") 

代替:

@Html.ActionLink("Home", "Index", "Home", new{/* route values */}, new {/* html attribues */}) 

这适用于我,也应该为你工作。

UPDATE:

,你可以创建一个像@(或-或其他任何东西)的象征,在URL中的action部分之前,以唯一网址,如:

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

这样,您的网址与默认地图路线不同,您可以创建类似以下网址:

site.com/@Home 
site.com/@About 
site.com/@Contact 

但在我的想法中,第一个更好,我总是使用它。

+0

这就是我刚刚发现并开始做的事情。这对我来说是有效的,除了actionlink也适用于我。 (它给出了所需的网址) – MoXplod

+1

但是,如果有人有另一种聪明的方式,所以我们不必重复这些代码行来添加到家庭控制器中的每一个动作都很棒。我将此标记为现在的答案, – MoXplod

+4

另一种方式(对于您的第二个评论)是在动作部分之前创建符号(例如@或 - 或其他任何内容),以便插入此示例,在答案的更新。 –

你可以简单地修改默认路由并卸下控制器位从url中指定它将始终为Home的默认值:

routes.MapRoute(
    "Default", 
    "{action}/{id}", 
    new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
); 

显然你意识到这会限制你的应用程序到一个单一的控制器,这是HomeController,因为现在你不再有任何可能将它设置在你的url中。在单个控制器中填充所有操作是恕我直言的惯例,违反了RESTful路由和SRP等一些原则。

+0

是的,这就是为什么问题..如何特殊情况下的一个控制器,所以我没有创建一吨控制器。谢谢。 – MoXplod

+0

@MoXplod,我向您展示了如何在我的答案中:通过修改您的global.asax中的默认路由并从url中移除“{controller}”位。 –

+0

是的,它的特殊情况家庭但打破了我的所有其他控制器的路线。我需要所有其他人按照他们现在所做的方式工作。 – MoXplod

+0

该解决方案看起来不错,干净,但性能如何,每个请求都经过反射来确定根。但是,这可以通过缓存控制器字典(该解决方案不显示)来解决。 – MoXplod

使用MVC5的属性路由,我做了类似Javad_Amiry答案,通过将路由在HomeController中每个动作:

public class HomeController : Controller 
{ 
    [Route("about")] 
    public ActionResult About() 
    { 
     return View(); 
    } 

我想这是不是把每一个动作更容易维护在全局RouteConfig.cs文件中。更好的做法是将属性路由与基于约定的路由结合起来,因此添加到控制器的新行为默认在没有路由属性的情况下工作(例如:/ Home/action),但可以通过添加路由属性(例如:/ action)来改进。

+0

我同意,试过这个,它对我很好。赶上:确保你启用RouteConfig.cs中的属性路由:'routes.MapMvcAttributeRoutes();' – Onisemus