ASP.net MVC routing with optional first parameter

前端 未结 4 1553
南笙
南笙 2020-12-08 23:32

I need to provide following functionality for one of the web sites.

http://www.example.com/[sponsor]/{controller}/{action}

Depending on the

4条回答
  •  Happy的楠姐
    2020-12-08 23:58

    In my case, I've resolved this issue using the following two routers:

    public class RouteConfig
    {
      public static void RegisterRoutes(RouteCollection routes)
      {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
        routes.MapRoute(
            name: "MultiCulture",
            url: "{culture}/{controller}/{action}",
            defaults: new { controller = "Home", action = "Index" },
            constraints: new { culture = new CultureConstraint(CultureFactory.All.Select(item => item.UrlPrefix).ToArray()) }
        ).RouteHandler = new MultiCultureMvcRouteHandler();
    
        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}",
            defaults: new { controller = "Home", action = "Index" }
        );
      }
    }
    

    Where CultureConstraint class looks like below:

    public class CultureConstraint : IRouteConstraint
    {
      private readonly string[] values;
    
      public CultureConstraint(params string[] values)
      {
        this.values = values;
      }
    
      public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary routeValues, RouteDirection routeDirection)
      {
        string value = routeValues[parameterName].ToString();
    
        return this.values.Contains(value);
      }
    }
    

    And MultiCultureMvcRouteHandler like this:

    public class MultiCultureMvcRouteHandler : MvcRouteHandler
    {
      protected override IHttpHandler GetHttpHandler(System.Web.Routing.RequestContext requestContext)
      {
        var culture = CultureManager.GetCulture(requestContext.RouteData);
    
        if (culture != null)
        {
          var cultureInfo = new CultureInfo(culture.Name);
    
          Thread.CurrentThread.CurrentUICulture = cultureInfo;
          Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(cultureInfo.Name);
        }
    
        return base.GetHttpHandler(requestContext);
      }
    }
    

提交回复
热议问题