平台:ASP.NET 4.0,MVC 4 RC,VS 2012
更新:我自己回答了我的问题。请参阅我在下面的回答
我想做什么:
我目前有一个名为www.a.com的网站,该网站面向特定的客户群。我想创建一个名为www.b.com的变体,它针对不同的部分。
然而,在后台,a和b的技术和代码对于大多数部分将是相同的,只有一些页面/内容根据用户是否使用域a或b进行浏览而不同。对我来说,为此目的创建一个新项目绝对没有意义。
然而,我并不清楚我应该如何实施www.b.com以及它在MVC中的流程。当某人来自www.b.com时,如何呈现不同的主页,经历了许多与www.a.com相同的页面,但有些页面根据URL是用于a还是b来呈现不同。
一些指示,提示,例子非常受欢迎。
更新:我自己回答了我的问题。请参阅我在下面的回答
答案 0 :(得分:2)
如果您依赖域名,那么您将难以编码可能会发生变化的信息。而不是这样做,而是基于子域做。你仍然在编写一些信息,但子域方式更灵活,在开发过程中更容易处理。
然后,您可以从每个域重定向到正确的子域。
例如
www.a.com # => redirects to site_a.somedomain.com
www.b.com # => redirects to site_b.somedomain.com
然后,您可以构建一个依赖于子域(site_a或site_b)的网站来确定要呈现的布局。
这样,即使域名发生变化,您的网站仍然有效。
答案 1 :(得分:2)
前段时间我在经典ASP中实现了类似的解决方案。我做的有点难看,但工作:
我创建了一个名为网站的表格(是的,每个网站不止一个),背景,主要颜色等。
在内容表中添加了一个列网站,为网站ID添加了FK。
创建了一个管理面板来更改此信息。
创建了一个在每个请求上运行的函数(在我的情况下,它通过包含文件在每个页面上运行)获取Request.ServerVariables["SERVER_NAME"]
的域名并查看我的表格。如果找到匹配项,则id将站点配置信息存储在具有站点ID的该域的cookie上,并使用此值加载会话变量,因此我可以使用它来查询正确的内容并显示“不同”的布局。在下次访问时,它会检查cookie,如果存在,则在会话中加载此信息;如果没有,请再次从数据库加载。
如果该功能未找到匹配项,则会重定向到“正在建设中的页面”。
答案 2 :(得分:0)
这是我最后做的事情
首先,感谢那些回复我帖子的人,你帮我思考了我能做些什么。最后,我所做的是一系列相当简单的事情。以下是:
我将我的新域名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
例如在HomePage中,我只是根据此变量切换视图
public ActionResult Index()
{
if (IsPageB)
return View("B_Home");
return View();
}
在视图中,我要么使用我在控制器中设置的ViewBag.IsPageB,要么如果没有控制器生成视图,我只需设置一个局部变量
@{
bool isPageB = Request.Url.Host.Contains("b.com");
}
然后根据此值生成标记。
到目前为止,这一切都运行良好,或许有更聪明的方法来做到这一点,但是出于我的目的,90%的底层代码在a或b,以及一些输出变化时是相同的,这很好。但我一直在寻找更清洁的方式。对于例如有没有什么方法可以在不使用ViewBag或将其附加到模型的情况下访问视图中的IsPageB变量?