【问题标题】:asp.net mvc3 - external includes or sharing layouts across projects?asp.net mvc3 - 外部包含或跨项目共享布局?
【发布时间】:2012-05-26 08:28:42
【问题描述】:

好的,我还是 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 一样。

【问题讨论】:

  • 那么,您想要某种可以被多个断开连接的站点访问的静态内容吗?
  • 理想情况下,是的。诸如“包含”顶部导航 XML 之类的东西会有所帮助,但是能够将整个 html 布局拆分为格式不正确的块,我可以在某个地方集中更新这些块是最好的。如果通过 MVC 无法做到这一点,我知道 Web 表单可能是最好的方法,因为我已经知道我可以使用 aspx 文件做到这一点。
  • WebForms 在这方面的功能与 MVC 没有任何不同。任何可能的是 WebForms 在 MVC 中也是可能的。

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


【解决方案1】:

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

您可以将普通的旧 HTML 文件放在一个 URL 上,例如 https://cms.domain.tld/templates/designxyz.html。该文件将提供一个基本布局,除了您的自定义应用程序内容所在的位置,您只需使用字符串“内容在此处”。

然后,您可以从 MVC 应用程序调用此 URL 以将 HTML 内容作为字符串获取。获得字符串后,您可以在“内容到这里”字符串之前和之后将其拆分为 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 帮助程序,然后在其他项目中重用该帮助程序(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 URL。

【讨论】:

  • 真的吗?跨项目重用布局似乎是一个有效的要求恕我直言。但是这种方式使它变得非常困难,并且是可反扩展的。每次显示视图时,都必须调用一个 URL。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多