2016-07-27 190 views
0

因此,我的新网站应用程序,是动态网页和基于子域的作品。 即http://company1234.domain.com 然后,我采取参数“company1234”并做一个web api调用来获取页面信息显示。ASP.NET MVC路由 - 子域名

这一切工作得很好。 但是我的问题是,如果我需要调用一个参数的URL即http://company1234.domain.com/Home/GetClient?id=abcdhttp://company1234.domain.com/Home/GetClientAccountDetails?model=abcd&acc=1234

我所有的路由被破坏,无法弄清楚如何我返工呢?

public class SubdomainRoute : RouteBase 
     { 
      public override RouteData GetRouteData(HttpContextBase httpContext) 
      { 
       if (httpContext.Request == null || httpContext.Request.Url == null) 
       { 
        return null; 
       } 

       var host = httpContext.Request.Url.Host; 
       var index = host.IndexOf("."); 

       string[] segments = httpContext.Request.Url.PathAndQuery.TrimStart('/').Split('/'); 

       if (index < 0) 
       { 
        return null; 
       } 

       var subdomain = host.Substring(0, index); 

       string controller = (segments.Length > 0) ? segments[0] : "Home"; 
       string action = (segments.Length > 1) ? segments[1] : "Index"; 


       var routeData = new RouteData(this, new MvcRouteHandler()); 
       routeData.Values.Add("controller", "Home"); 
       routeData.Values.Add("action", action); 
       routeData.Values.Add("subdomain", subdomain); 



      return routeData; 
      } 

      public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values) 
      { 
       //Implement your formating Url formating here 
       return null; 
      } 
     } 

我的控制器方法

public ActionResult Index(string subdomain) 
     { 
//Go get custom page info 
      var profile = GetProfile(subdomain); 



      return View("Default", profile); 
     } 

public JsonResult GetClient(string id) 
     { 

//do stuff 
} 

我的全球

public static void RegisterRoutes(RouteCollection routes) 
     { 
      routes.Add(new SubdomainRoute()); 

      routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
      routes.IgnoreRoute("favicon.ico"); 
      routes.MapRoute("Home", 
          "", 
          new { controller = "Application", action = "Login" }); 
      routes.MapRoute(
       "Default", // Route name 
       "{controller}/{action}/{id}", // URL with parameters 
       new {controller = "Home", action = "Index", id = UrlParameter.Optional}); 
     } 

如果我打电话 http://company1234.domain.com/Home/GetClient

那么这种方法被击中,但如果我叫 http://company1234.domain.com/Home/GetClient?id=1234 它不起作用

任何想法,我需要做的,以重新工作,并得到它的工作?

回答

0

路线需要做两件事情:

  1. 确定它们是否符合要求。
  2. 如果他们这样做,返回一组路由值。

要处理第一个要求,必须将路线返回null,如果它不匹配传入的请求。这告诉路由框架检查路由表中的下一个注册路由。

问题是你的路由不检查以确保传递的URL是它应该处理的东西,因此它总是匹配请求,并且因为它在所有其他路由之前被注册,所以没有其他路由可以被达到。通常情况下,检查httpContext.Request.Path以确保它符合某些标准,如果不符合,则应返回null