如何使用1个解决方案实现对2个网站的支持

时间:2012-06-30 23:48:17

标签: asp.net-mvc asp.net-mvc-3 visual-studio-2010 razor

平台: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来呈现不同。

一些指示,提示,例子非常受欢迎。

更新:我自己回答了我的问题。请参阅我在下面的回答

3 个答案:

答案 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)

这是我最后做的事情

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

  1. 我将我的新域名www.b.com指向我的网站主机,因此输入www.b.com将指向www.a.com(CNAME)的根目录

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

  3. 我有一个所有控制器派生自的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变量?