如何从Mvc中的HomeController中删除Home

时间:2016-11-06 01:32:11

标签: c# asp.net-mvc asp.net-mvc-routing url-routing

我有一个HomeController,它有很多动作。我希望用户无需键入Home即可访问我的操作。这是下面的路线

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

我希望用户不要输入控制器名称,在这种情况下是Home。我怎样才能做到这一点?或者是强制性的吗?

2 个答案:

答案 0 :(得分:2)

解决方案01 (属性路由)

在RouteConfig

中的其他路线的顶部添加以下行
        routes.MapMvcAttributeRoutes();

然后根据需要在每个操作的顶部添加属性路由。 (在这种情况下,在家庭控制器中的动作)
例如。下面的代码示例将从http://site/Home/About中删除“/ Home”,并在http://site/About

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

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

添加到RouteConfig的新路由映射,如下所示。 (请记住在默认(通用)路由之前添加这些特定路由。

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>

答案 1 :(得分:1)

您可以在defult路线之前添加自定义路线,如下所示:

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 }
    );