asp.net mvc3 - 外部包含或共享项目的布局?

时间:2012-05-18 18:47:01

标签: asp.net asp.net-mvc-3 coldfusion content-management-system areas

好的,我还是Asp.Net和MVC3的新手。我对事物越来越熟悉,但在完成我的第一个Web应用程序(一个简单的Web表单提交到数据库)后仍在进行实验。现在我正在开展较小的项目,例如转换一些提交电子邮件的旧ColdFusion Web表单。我很容易在MVC3中实现这一点,但我们所有的网页都在一个单独的内容管理系统中,我们的中心HTML模板就是这样。我already asked a question about this here并没有到达任何地方。

我们所拥有的是大多数网页从CMS导出为直接HTML文件,只有那些需要数据库访问或编程语言的网页才会导出为ColdFusion。在CMS中模板内部使用ColdFusion代码非常容易。我希望能够在我的mvc3项目中使用此HTML模板,但我发现无法执行“包含”或链接到外部文件。我不知道这是如何工作的,所以我决定将模板复制/粘贴到mvc3并找出一种方法我可以在所有小项目之间共享这个模板(现在是“布局”)我将是继续努力。如果模板更改,我不想更新每个小的mvc3 Web应用程序。我学会了使用“区域”,但似乎你不能只将一个区域发布到Web服务器上的文件夹,整个项目都必须部署。

我真正需要的是一个小型mvc3项目使用一个模板的方法,这些小型mvc3项目分散在我们的Web服务器上。这最好是在一个发布到多个不同文件夹的大型项目中完成,还是可以共享一个共同布局的许多小项目?这两种中的任何一种都可能吗?

在尝试完所有这些之后,我开始认为MVC无法满足我的需求。它似乎更适合于Intranet应用程序或整个网站,而不是像我想要的那样“这里和那里”应用程序。我应该学习Web表单吗?我知道我可以在CMS中“包含”一个aspx文件,就像我使用ColdFusion一样。

1 个答案:

答案 0 :(得分:0)

您的模板是否必须从CMS“导出”?或者,您是否可以在静态CMS URL上“存在”模板?这就是我们为需要数据库访问/无法在CMS中轻松完成的应用程序所做的事情,但需要共享相同的外观。

您可以做的是将您的普通旧HTML文件存放在网址中,例如https://cms.domain.tld/templates/designxyz.html。该文件将提供基本布局,除了您的自定义应用程序内容之外,您只需使用字符串“content goes here”。

然后,从MVC应用程序中,您可以调用此URL以将HTML内容作为字符串获取。获得字符串后,可以在“content goes here”字符串之前和之后将其拆分为2。然后,在layout.cshtml文件中,您可以执行以下操作:

@{
    const string contentPlaceholder = "content goes here";
    var allHtml = GetHtmlTemplateFromLiveServer();
    var index = allHtml.IndexOf(contentPlaceholder);
    var topHtml = allHtml.Substring(0, index);
    var botHtml = allHtml.Substring(index + contentPlaceHolder.Length);
}
@topHtml
@RenderBody()
@botHtml

如果这样的东西有效,你可以将所有这些抽象到HTML Helper中,然后在其他项目中重用该帮助器(NuGet会对此有所帮助)。

_Layout.cshtml

@{
    var options = new CmsTemplateRenderOptions
    {
        Url = "https://cms.domain.tld/templates/designxyz.html",
        Cache = new TimeSpan(1, 0, 0);
    };
}
@Html.RenderCmsTemplate(CmsTemplateRenderRegion.Top, options)
@RenderBody()
@Html.RenderCmsTemplate(CmsTemplateRenderRegion.Bottom, options)

然后,要更新所有应用的布局,您只需将更改发布到https://cms.domain.tld/templates/designxyz.html网址即可。