3

平台: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,呈现不同的页面。

非常感谢一些指针,提示,示例。

更新:我自己回答了我的问题。请看下面我的回复帖

4

3 回答 3

2

如果您依赖域名,那么您将硬编码可能会更改的信息。与其这样做,不如根据子域来做。您仍在对一些信息进行硬编码,但子域方式更加灵活,并且在开发中更容易处理。

然后,您可以从每个域重定向到正确的子域。

例如

www.a.com # => redirects to site_a.somedomain.com
www.b.com # => redirects to site_b.somedomain.com

然后,您可以构建一个依赖子域(site_a 或 site_b)的网站来确定要呈现的布局。

这样,即使域名更改您的网站仍然有效。

于 2012-07-01T01:44:42.023 回答
2

前段时间,我在经典 ASP 中实现了与此类似的解决方案。我所做的有点难看,但有效:

  • 我创建了一个名为 sites 的表,其中包含域(是的,每个站点不止一个)、背景、主颜色等。

  • 向内容表添加了一个列站点,FK 为站点 ID。

  • 创建了一个管理面板来更改此信息。

  • 创建了一个在每个请求上运行的函数(在我的情况下,它通过包含文件在每个页面上运行)获取域名Request.ServerVariables["SERVER_NAME"]并查看我的表。如果找到匹配项,id 将站点配置信息存储在具有站点 id 的域的 cookie 中,并使用此值加载会话变量,因此我可以使用它来查询正确的内容并显示“不同”布局。下次访问时,它会检查 cookie,如果存在,则在会话中加载此信息;如果没有,请再次从数据库加载。

  • 如果函数找不到匹配项,它会重定向到“正在建设的页面”。

于 2012-07-01T01:58:34.523 回答
0

这就是我最终所做的

首先,感谢那些回复我帖子的人,你们帮助我思考了我能做些什么。最后,我所做的只是一系列相当简单的事情。就是这样:

  1. 我将我的新域 www.b.com 指向我的网络主机,因此键入 www.b.com 将指向 www.a.com (CNAME) 的根

  2. 在我的解决方案中,我做了以下

我有一个所有控制器都派生自的 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 相同,并且一些输出发生变化,这很好。但我一直在寻找更清洁的方法。例如,有什么方法可以在不使用 ViewBag 或将其附加到模型的情况下访问视图中的 IsPageB 变量?

于 2012-07-03T12:55:27.980 回答