代码之家  ›  专栏  ›  技术社区  ›  Freddy Castelblanco

修改路由asp mvc

  •  0
  • Freddy Castelblanco  · 技术社区  · 7 年前

    在我的ASP MVC应用程序中,我需要如下所示显示URL路径:

    领域com/视图名称

    我的路线配置如下:

    public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
            routes.RouteExistingFiles = false;
            routes.IgnoreRoute("{*allfiles}", new { allfiles = @".*\.(css|js|gif|jpg|png)" });            
    
            routes.MapRoute(
               "Theme",
               "theme/{theme}/{page}",
               new { controller = "Theme", action = "Index", page = UrlParameter.Optional },
               new[] { "Tenant.Controllers" }
            );
    
            routes.MapRoute(
               "ThemeSlider",
               "theme/slider/{id}",
               new { controller = "Theme", action = "Slider" },
               new[] { "Tenant.Controllers" }
            );
    
            routes.MapRoute(
                "Default",
                "{controller}/{action}/{id}",
                new { controller = "Home", action = "Index", id = UrlParameter.Optional },
                new[] { "Tenant.Controllers" }
            );
    
            routes.MapRoute(
                "Default_tenant",
                "{page}",
                new { controller = "Home", action = "Index", page = UrlParameter.Optional },
                new[] { "Tenant.Controllers" }
            );
    
            routes.MapMvcAttributeRoutes();
        }
    

    但它不起作用,我必须按以下方式指定page参数: 领域com/?页面=视图名称 . 离开以下路线的路线配置应如何:

    领域通用域名格式。co/控制器/操作/ 领域通用域名格式。co/视图

    有什么建议吗??提前感谢

    1 回复  |  直到 7 年前
        1
  •  0
  •   Adam Brown    7 年前

    你的意思是摆脱控制器?这类事情会起作用,但要注意不同控制器中路由之间的冲突:

    routes.MapRoute(
        name: "HomeRoute",
        url: "{action}",
        defaults: new {controller = "Home", action = "Index"},
        constraints: new { homeControllerConstraint = new HomeControllerConstraint() }
    );
    

    现在,主控制器中的每个操作都映射到域。com/操作,而不是域。com/主页/操作。

    例如,这里有一些反射代码,可以有效地确定路由是否在主控制器中。

    internal class HomeControllerConstraint : IRouteConstraint
    {
        private static readonly Lazy<HashSet<string>> homeMethods = new Lazy<HashSet<string>>(CreateHomeMethods);
    
        private static HashSet<string> CreateHomeMethods()
        {
            return typeof(HomeController).GetMethods().Select(e => e.Name.ToLower()).ToSet();
        }
    
        public static bool Exists(string name)
        {
            return homeMethods.Value.Contains(name.Trim().ToLower());
        }
    
        public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
        {
            return homeMethods.Value.Contains(values["action"].ToString().ToLower());
        }
    }