我有一个包含多个区域的MVC应用程序。它们共享许多通用代码和组件,因此我不想将它们分解为单独的项目。但我想将它们部署到不同的网站上。
正常路由是:
www.mysharedsite.com/Area1
www.mysharedsite.com/Area2
...
但我想将它们部署为:
www.area1site.com/
www.area2site.com/
...
我正在考虑在web.config中添加一个字段,然后在每个区域的RouteConfig和RegisterAreas中添加逻辑来更改路由并完全关闭路由到控制器。但这似乎很糟糕。
这样做有干净的方法吗?
答案 0 :(得分:1)
我要做的是创建并安装一个自定义ActionInvoker,它从请求中读取主机名,并根据它为您设置适当的区域路径:
protected override ActionResult InvokeActionMethod(...)
{
// Get hostname
var hostname = controllerContext.HttpContext.Request.Url.Host;
if (hostname == "some value you want")
{
controllerContext.RouteData.DataTokens["area"] = "your area here";
}
return base.InvokeActionMethod(controllerContext, actionDescriptor, parameters);
}
答案 1 :(得分:1)
您可以根据主机名指定路由,将其映射到某个区域。根据您问题中的网址格式:
routes.Add("DomainRoute", new DomainRoute(
"{area}site.com", // Domain with parameters
"{id}", // URL with parameters
new { controller = "Home", action = "Index", id = "" } // Parameter defaults
));
请参阅此帖子了解DomainRoute类:
http://blog.maartenballiauw.be/post/2009/05/20/ASPNET-MVC-Domain-Routing.aspx
答案 2 :(得分:0)
为什么不将公共代码放在单独的dll中 并将您的网站链接到此dll?
如果您添加另一个也共享公共代码的网站,您的解决方案会更大。