如何在Mvc中从HomeController中移除Home

本文关键字:Home HomeController 中从 Mvc | 更新日期: 2023-09-27 18:16:26

我有一个HomeController它里面有很多Actions。我希望用户在不输入Home的情况下访问我的操作。以下是

下面的Route
routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );

我希望用户不要输入控制器名称,在本例中为Home。我该怎么做呢?还是强制性的?

如何在Mvc中从HomeController中移除Home

你可以像这样在默认路由之前添加自定义路由:

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

方案01(属性路由)

在RouteConfig

中其他路由的顶部添加下面一行
        routes.MapMvcAttributeRoutes();

然后根据需要在每个动作的顶部添加一个属性路由。(本例中主控制器中的动作)
如。下面的代码示例将从http://site/Home/About中删除"/Home",并在http://site/About

上提供。
[Route("About")] 
public ActionResult About()
{

解决方案02(使用路由约束)[Source]

在routecconfig中添加一个新的路由映射,如下所示。(请记住在缺省(通用)路由之前添加这些特定路由。

routes.MapRoute(
    "Root",
    "{action}",
    new { controller = "Home", action = "Index", id = UrlParameter.Optional },
    new { isMethodInHomeController = new RootRouteConstraint<HomeController>() }
);

这将把Home从Home控制器的所有动作(路由)中移除RootRouteConstraint类

public class RootRouteConstraint<T> : IRouteConstraint
{
    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
    {
        var rootMethodNames = typeof(T).GetMethods().Select(x => x.Name.ToLower());
        return rootMethodNames.Contains(values["action"].ToString().ToLower());
    }
}

可选信息:这一行(约束)将确保只对HomeController

应用此路由
new { isMethodInHomeController = new RootRouteConstraint<HomeController>