ASP.NET MVC 3控制器路由 - 使主控制器下的所有内容都出现在域下

MoX*_*lod 17 asp.net-mvc-3

目前,homecontroller下的所有内容都显示在URL中

example.com/Home/{Action}
Run Code Online (Sandbox Code Playgroud)

有没有办法,我们可以保持所有其他路由的方式,但只有特殊情况家庭控制器,所以家里的一切都属于域名.

喜欢

example.com/about
example.com/contact
example.com/error
Run Code Online (Sandbox Code Playgroud)

而不是为每个人创建新的控制器类.

编辑:

其他网址就像

example.com/user/details/123
example.com/user/edit/123
Run Code Online (Sandbox Code Playgroud)

userController中的哪些应该与现在一样

jav*_*iry 14

我认为最好的方法是:

 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
 );
Run Code Online (Sandbox Code Playgroud)

当您想要创建链接时,请使用:

@Html.RouteLink("Home", "home", new{/* route values */}, new {/* html attribues */})
Run Code Online (Sandbox Code Playgroud)

要么:

@Html.RouteLink("Home", "home")
Run Code Online (Sandbox Code Playgroud)

代替:

@Html.ActionLink("Home", "Index", "Home", new{/* route values */}, new {/* html attribues */})
Run Code Online (Sandbox Code Playgroud)

这适合我,也应该适合你.

更新:

您可以在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
     );
Run Code Online (Sandbox Code Playgroud)

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

site.com/@Home
site.com/@About
site.com/@Contact
Run Code Online (Sandbox Code Playgroud)

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

  • 另一种方式,(对于你的第二个评论),是在动作部分之前创建一个符号(例如@或 - 或其他任何东西),我在答案的更新中插入了一个这样的例子. (4认同)
  • 但是,如果有人采用另一种巧妙的方法,那么我们不必为每次操作重复这些代码行,这对我添加到家庭控制器来说将是很棒的。我现在将其标记为答案, (2认同)

Dav*_*ell 6

使用MVC5的属性路由,我做了类似于Javad_Amiry的答案,在HomeController中为每个动作放置一个路由:

public class HomeController : Controller
{
    [Route("about")]
    public ActionResult About()
    {
        return View();
    }
Run Code Online (Sandbox Code Playgroud)

我认为这比将所有操作放在全局RouteConfig.cs文件中更易于维护.更好的是将属性路由与基于约定的路由相结合,因此添加到控制器的新操作默认情况下不使用Route属性(例如:/ Home/action),但可以通过添加Route属性(例如:/ action)来改进.