【问题标题】:ASP.NET MVC 3 Controller route - make everything under home controller appear under the domainASP.NET MVC 3 控制器路由 - 使主控制器下的所有内容都出现在域下
【发布时间】:2011-09-07 22:06:29
【问题描述】:

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

example.com/Home/{Action}

有没有一种方法可以让所有其他路由保持原样,但只有特殊情况的 home 控制器,所以 home 下的所有东西都在域下。

喜欢

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

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

编辑:

其他网址的类似

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

userController 中的内容应该和现在一样

【问题讨论】:

  • routes.MapRoute("Default", "{action}", new {controller = "Home", action = "{action}"});

标签: asp.net-mvc-3


【解决方案1】:

我认为最好的方法是:

 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 */})

或者:

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

代替:

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

这对我有用,也应该对你有用。

更新:

您可以在 url 中的 action 部分之前创建一个类似 @(或 - 或其他任何东西)的符号,以使 url 唯一,例如:

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

但在我看来,第一个更好,我总是使用它。

【讨论】:

  • 这是我刚刚发现并开始做的事情。这对我有用.. 除了 actionlink 也适用于我。 (它给出了所需的网址)
  • 但是,如果有人有另一种聪明的方法,那么我们不必为我添加到家庭控制器的每个操作重复这些代码行,那就太好了。我暂时将其标记为答案,
  • 另一种方式(对于您的第二条评论)是在操作部分之前创建一个符号(例如 @ 或 - 或其他任何东西),我在答案中插入一个示例更新。
  • 这是一个很好的解决方案——我最终可能会使用 _ 或其他东西。
【解决方案2】:

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

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

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

【讨论】:

  • 我同意,试过这个,它对我很有用。不过请注意:确保在 RouteConfig.cs 中启用属性路由:routes.MapMvcAttributeRoutes();
【解决方案3】:

您可以简单地修改默认路由并从 url 中删除控制器位,并指定它在默认值中始终为 Home

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

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

【讨论】:

  • 是的,这就是为什么问题......谢谢。
  • @MoXplod,我在回答中向您展示了如何:通过修改 global.asax 中的默认路由并从 url 中删除 {controller} 位。
  • 是的,它在特殊情况下是 home,但会破坏我所有其他控制器的路由。我需要所有其他人按照他们现在的方式工作。
  • @MoXplod,我认为您完全错过了我回答的重点。您不能拥有具有此类路由的其他控制器 :-) 您如何期望路由引擎知道要从以下 url /index 调用哪个控制器?如果您想拥有除 Home 之外的其他控制器,则必须通过某种方式在 url 中指定它们。
【解决方案4】:

【讨论】:

  • 该解决方案看起来很干净,但是性能呢,每个请求都经过反射来确定根。但这可以通过缓存控制器字典来解决(该解决方案没有显示)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多