Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 如何使用一个解决方案实现对两个网站的支持_Asp.net Mvc_Asp.net Mvc 3_Visual Studio 2010_Razor - Fatal编程技术网

Asp.net mvc 如何使用一个解决方案实现对两个网站的支持

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及其流程。如何呈现不同的主页当

平台: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

非常感谢一些指点、提示和示例


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

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

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

比如说

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

  • 已创建管理面板以更改此信息

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

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


    • 以下是我最后做的事情

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

    • 我将我的新域名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方法。