我尝试用软,我的问题是- 在那里我有Page_Load逻辑的主页与web表单,应该在哪里就去视? 这里的企业的情况:

  • 不同主办标题应当引起不同的网页标题是显示在网站(一)主页上,因此所有网页。例如,如果主机头hello.mydomain.com,该页标题应该是"你好世界"的所有网页的/意见,同时goodbye.mydomain.com 应该是"别了世界"的所有网页的/意见。
  • 如果主机头是不同的,比任何东西我在列表中,无论在哪里,在应用程序,它应该重定向到/错误/NoHostHeader.

此前,我想把这个放在提供Load()事件,并且它看起来像在视,我可以做到这一点无论是在每一个控制器(不觉得有权有叫这个功能,在每一个控制器)或某个地方在全球性的。asax(看起来太...全球?).

编辑: 我已经得到这个工作成功使用全球性的。asax方法结合一个控制器,用于实际处理的数据。唯一的问题在这一点是,所有主头信息是在一个数据库。我通常会储存"承租人"的信息,如果你将在一届会议变,只做一个数据库电话的时候它不在那里;有没有更好的方式做到这一点?

有帮助吗?

解决方案

有没有1:1同等视为一原因,我们只是扼要重述如何考虑它的视的方式:

模型:"页面,该网站总是要求在某些方面,让我们叫它承租人(或用户,主题或者不管你的副域表示)。该领域模型有一个酒店代表租户目前的请求。"

:"呈现该页标题取决于租户的设的模式"。

控制器:"设置租户的模型,这取决于主机的头".

牢记我们想要避免的 混合 控制器,视和业务逻辑。具有的逻辑控制器在一个地方或一个地方,这不是所谓的"控制"是不是一个问题,只要它仍然是分开的。

和现在很好的事情: 你可以做到这个"视式"即使网络的形式, 和解决方案仍然适用ASP.NET 视!

你仍然请求的生命周期(不页生命周期),这样就可以实现一个自定义HttpModule,其中包含的这一部分的逻辑控制器的所有请求。它处理的BeginRequest事件,检查了主机头,并商店的租户喜欢的东西HttpContext.电流。项目["承租人"].(当然,你可以有一个静态的,类型包装用于这本词典的条目。)

然后你所有的模型对象(或者一个模型基类,或任何适当的解决方案)可以访问HttpContext提供访问这些信息是这样的:

public string Tenant
{
    get { return HttpContext.Current.Items["tenant"]; }
}

优点:

  • 你有分离会引起(东道头)和效力(渲染页标题),提高可维护性和可测性
  • 因此你可以很容易增加额外的行为,以你的领域模型基于这种状态,就像装载内容从数据库中根据目前的租户。
  • 你可以轻易地做出更多的部分景取决于租户,就像CSS文件包括一个标志图像等。
  • 你以后可以改变的逻辑控制器的设定承租人在该模式不仅仅基于子域,但也许根据一个饼干,一个推荐人、搜索语、用户代理人的语言,或者任何你可以想想,而不修改任何代码的根据的模型。

更新的重新编辑:我不喜欢这个主意保持国家在该届会议上,特别是如果你的话饼干可能不仅适用于每个子域,但所有领域。在这种情况下,你可能不一致的内容,如果用户visted另一个副域之前。可能信息在数据库中的映射机头向租户不会经常变化的,因此可以缓存这并不需要一个数据库查询每项请求。

其他提示

你可以创建一个基础控制器,提供正确的可视数据用你的视的主页查,然后推导出每个实际控制从那一个。如果你把逻辑进入ActionExecuting的方法,应该能够产生异常或重新定向的一个错误页,如果有必要的。

你是想太"web表单",并没有足够的视.主页仅仅是一个包装,你看,它应该只包含的布局html。你可以送东西给你的主人,但这是一个单向的公路和你应该努力为无关的意见。底线:忘记有关的事件web表单了,因为他们不会在此使用。

因为你正在处理的主机头,我想你可以把它放在全球性的。asax...伟大的现在我很困惑:P

被盗的代码 http://forums.asp.net/t/1226272.aspx

protected void Application_BeginRequest(object sender, EventArgs e)
        {
            string host = string.Empty;

            if (this.Request.ServerVariables["HTTP_HOST"] == this.Request.Url.DnsSafeHost)
            {
                host = this.Request.Url.DnsSafeHost;
            }
            else
            {
                Regex regex = new Regex("http://[^/]*.host/([^/]*)(/.*)");
                Match match = regex.Match(this.Request.Url.AbsoluteUri);

                if (match.Success)
                {
                    host = match.Groups[1].Value;
                    Context.RewritePath(match.Groups[2].Value);
                }
            }

            // Match the host with the portal in the database
            ...
        } 
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top