单个MVC Web应用程序,具有多个URL重定向到不同的控制器
问题的出现原因是在单一MVC Web应用程序中,需要根据不同的URL重定向到不同的控制器。解决方法是使用Maartin Balliauw编写的代码,该代码创建了一个DomainRoute类,可以与普通路由非常相似地使用。
这个解决方案有一个问题。假设你想将子域名作为不同的用户处理:routes.Add("SD", new DomainRoute("user}.localhost", "", new { controller = "Home", action = "IndexForUser", user="u1" } )); 它也会缓存主页。这是因为生成的正则表达式的原因。为了解决这个问题,你可以在DomainRoute.cs中复制CreateRegex方法,将其命名为CreateDomainRegex,将此行上的*更改为+:source = source.Replace("}", @">([a-zA-Z0-9_]*))"); 并在GetRouteData方法中使用这个新方法作为域名正则表达式:domainRegex = CreateDomainRegex(Domain)。
作者在测试代码时遇到了问题,他无法运行代码,只收到了"SERVER NOT FOUND"错误。他询问是否需要进行其他配置。
对于localhost的测试,可以在web.config中设置base DNS域。典型的值可能是.example.org。另外,如果项目运行在localhost:42323上,可以使用localhost:42323作为URL进行测试。
这篇文章介绍了在使用MVC5进行路由时,如何捕获子域名并保留标准的MVC5路由特性,并提供了相关的解决方法。
文章中提到了使用SubdomainRoute类来捕获子域名,这个类是从Route类派生出来的。SubdomainRoute类还允许将子域名作为查询参数来指定,这样可以在配置DNS子域名之前进行测试。同时,使用查询参数还可以在Visual Studio 2013中进行本地调试,而无需进行netsh配置或以管理员身份运行。默认情况下,IIS Express只绑定到localhost,而不会绑定到类似sub.localtest.me这样的同义主机名。
文章中给出了SubdomainRoute类的代码实现,包括GetRouteData和GetVirtualPath方法的重写,以及MapSubdomainRoute方法的定义。同时,还给出了一个有用的建议,即创建一个Controller基类,其中包含Subdomain属性,可以方便地访问子域名。
最后,文章中还回答了一个问题,即是否可以在使用路由属性时使用这种方法。回答是不可以,但可以构建自己的属性路由系统来实现类似的功能。
这篇文章介绍了如何在MVC5中捕获子域名并保留标准的MVC5路由特性,同时给出了相应的代码实现和解决方法。
问题的原因是需要在单个MVC Web应用程序中使用多个URL重定向到不同的控制器。解决方法是创建一个新的路由,并将其添加到全局.asax的路由集合中。
以下是一个简单的自定义路由示例:
public class ExampleRoute : RouteBase { public override RouteData GetRouteData(HttpContextBase httpContext) { var url = httpContext.Request.Headers["HOST"]; var index = url.IndexOf("."); if (index < 0) return null; var subDomain = url.Substring(0, index); if (subDomain == "user1") { var routeData = new RouteData(this, new MvcRouteHandler()); routeData.Values.Add("controller", "User1"); //跳转到User1Controller类 routeData.Values.Add("action", "Index"); //跳转到User1Controller的Index方法 return routeData; } if (subDomain == "user2") { var routeData = new RouteData(this, new MvcRouteHandler()); routeData.Values.Add("controller", "User2"); //跳转到User2Controller类 routeData.Values.Add("action", "Index"); //跳转到User2Controller的Index方法 return routeData; } return null; } public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values) { //在这里实现你的URL格式化 return null; } }
在全局.asax中的RegisterRoutes方法中,可以通过以下方式执行.Add操作:
routes.Add(new ExampleRoute());
这种方法是否需要硬编码可能的子域名列表?
不需要,可以添加一个名为"subdomain"的数据库字段,该字段将是你期望的特定用户的子域名,或者其他任何内容,然后只需对子域名进行查找。
有人可以推荐一个WebForms版本吗?