【问题标题】:How to remove Home from HomeController in Mvc如何在 Mvc 中从 HomeController 中删除 Home
【发布时间】:2016-11-06 01:32:11
【问题描述】:

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

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

我希望用户不要输入控制器名称,在本例中为 Home。我怎样才能做到这一点?还是强制的?

【问题讨论】:

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


【解决方案1】:

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

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

【讨论】:

    【解决方案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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-04
      • 1970-01-01
      • 2016-12-25
      • 2017-04-21
      • 2010-09-12
      • 1970-01-01
      相关资源
      最近更新 更多