Asp.net mvc 如何使用一个解决方案实现对两个网站的支持
平台:ASP.NET 4.0,MVC4RC,VS 2012 更新:我自己回答了我的问题。请参阅下面我的回复帖子 我想做什么: 我目前有一个名为www.a.com的网站,针对特定的客户群体。我想创建一个名为www.b.com的变体,它针对不同的细分市场 然而,在后台,a和b的技术和代码在大多数部分是相同的,只有一些页面/内容不同,这取决于用户是使用域a还是b浏览。对于我来说,为这个目的创建一个新项目是毫无意义的 然而,我一点也不清楚如何在MVC中实现www.b.com及其流程。如何呈现不同的主页当某人来自www.b.com时,会浏览许多与www.a.com相同的页面,但有些页面呈现的不同取决于URL是针对a还是b 非常感谢一些指点、提示和示例Asp.net mvc 如何使用一个解决方案实现对两个网站的支持,asp.net-mvc,asp.net-mvc-3,visual-studio-2010,razor,Asp.net Mvc,Asp.net Mvc 3,Visual Studio 2010,Razor,平台:ASP.NET 4.0,MVC4RC,VS 2012 更新:我自己回答了我的问题。请参阅下面我的回复帖子 我想做什么: 我目前有一个名为www.a.com的网站,针对特定的客户群体。我想创建一个名为www.b.com的变体,它针对不同的细分市场 然而,在后台,a和b的技术和代码在大多数部分是相同的,只有一些页面/内容不同,这取决于用户是使用域a还是b浏览。对于我来说,为这个目的创建一个新项目是毫无意义的 然而,我一点也不清楚如何在MVC中实现www.b.com及其流程。如何呈现不同的主页当
更新:我自己回答了我的问题。请参阅下面我的回复帖子如果您依赖域名,那么您将对可能更改的信息进行硬编码。与其这样做,不如基于子域来做。您仍然在硬编码一些信息,但子域方式更灵活,在开发中更容易处理 然后可以从每个域重定向到正确的子域 比如说
www.a.com # => redirects to site_a.somedomain.com
www.b.com # => redirects to site_b.somedomain.com
然后,您可以构建一个依赖子域(site_a或site_b)来确定要渲染的布局的网站
这样,即使域名改变了,你的网站也能正常工作。不久前,我在经典ASP中实现了类似的解决方案。我所做的有点难看,但奏效了:
- 我创建了一个名为sites的表,其中包含域(是的,每个站点不止一个)、背景、主颜色等
- 向内容表中添加了一个列站点,站点ID为FK
- 已创建管理面板以更改此信息
- 创建了一个在每个请求上运行的函数(在我的例子中,它通过一个包含文件在每个页面上运行),通过
获取域名,并查看我的表。如果它找到一个匹配项,id将站点配置信息存储在该域的cookie上,并使用站点id加载会话变量,这样我就可以使用它来查询正确的内容并显示“不同”的布局。在下次访问时,它会检查cookie,如果cookie存在,则将此信息加载到会话中;如果没有,请从数据库重新加载request.ServerVariables[“SERVER\u name”]
- 如果函数找不到匹配项,它将重定向到“正在构建的页面”
- 我将我的新域名www.b.com指向我的网络主机,因此键入www.b.com将指向www.a.com(CNAME)的根
- 在我的解决方案中,我做了以下几点 我有一个所有控制器都派生自的BaseController,在那里我声明了IsPageB
- 以下是我最后做的事情
首先,感谢那些回复我帖子的人,你们帮助我思考我能做些什么。最后,我做了一系列相当简单的事情。以下是方法:
public class BaseController : Controller
{
//
// GET: /Base/
...
protected bool IsPageB = false;
....
}
在BaseController中,我根据主机设置其值
protected override void OnActionExecuting(ActionExecutingContext ctx)
{
...
IsPageB = Request.Url.Host.Contains("b.com");
...
}
所以在每个控制器中,我检查IsPageB
例如,在主页中,我只是根据此变量切换视图
public ActionResult Index()
{
if (IsPageB)
return View("B_Home");
return View();
}
在视图中,我使用我在控制器中设置的ViewBag.IsPageB,或者如果没有生成视图的控制器,我只需设置一个局部变量
@{
bool isPageB = Request.Url.Host.Contains("b.com");
}
然后基于此值生成标记
到目前为止,这一切都很好,也许有一种更聪明的方法可以做到这一点,但对于我来说,如果90%的底层代码与a或b相同,并且一些输出发生了变化,那么这就很好了。但我一直在寻找更干净的方法。例如,是否有某种方法可以访问视图中的IsPageB变量,而无需使用ViewBag或将其附加到模型?并且重定向是否对最终用户不可见-即,他们只看到www.b.com/someURL,而不看到site_b.somedomain.com/?最终用户不应注意www.a.com。从目前为止的回复来看,似乎没有MVCish方法来解决这个问题…?是的,您可以这样做,以便用户不会注意到重定向。但是如果你不想改变的话,你必须做一些url重写。据我所知,在这方面没有MVCish方法。