【问题标题】:Will the Spark view engine interoperate with webforms master pages?Spark 视图引擎是否会与 webforms 母版页互操作?
【发布时间】:2010-12-04 23:58:21
【问题描述】:

我真的很喜欢 Spark,但我们已经在基于 Web 表单的视图上投入了大量资金。我想开始使用 Spark,而无需预先转换所有现有视图。

让 Spark 与 Web 表单并行工作的唯一问题是母版页。目前,我的 spark 布局是 1 对 1 的母版页副本。

这种重复数量是不可接受的。我已经被它咬过好几次了。

有什么方法可以让 spark 视图在 webforms master 中工作?或者让 webforms 视图在 spark 布局中工作?两者都可以解决重复问题。

【问题讨论】:

    标签: asp.net-mvc spark-view-engine


    【解决方案1】:

    我不这么认为。从架构上讲,两者在呈现页面时具有完全不同且相互冲突的方式。要实现它,您需要做一些与 iFrame 等效的操作,这是一种非常笨拙的方式来实现它,以至于成为一种反模式。

    在读取母版页时,火花引擎已经完成,反之亦然。

    您可以尝试模拟母版页在 spark 引擎中的呈现方式。不仅仅是视觉上......我说的是使用 spark 拼凑一个自制的母版页预处理器。锄头不容易。

    【讨论】:

      【解决方案2】:

      只是一个想法,尝试编写一个自定义视图引擎(或调整 Spark 的),它将使用 Spark 引擎呈现请求的 .spark 视图,然后调用 WebForms 引擎将呈现的内容传递给它 - 我认为这应该是可能的,但我对这些内部结构一无所知。一种更简单的方法是将呈现的 .spark HTML 保存到 .aspx 并让 WebForms 选择它 - 但性能将无法接受。

      无论如何,我认为这应该是可能的,但是 1) 将需要对视图引擎进行复杂的调整,以及 2) 您将失去大部分 Spark/layouts 功能,因为您的 .spark 视图大部分会呈现为没有 spark 布局全部。

      另外,请尝试在 Spark 邮件列表中提问。

      【讨论】:

      • Spark 自己已经做到了。问题不在于呈现正确的文件,而是让文件 .spark 或 .aspx 使用单个母版页。
      • 嗯,我明白了。我想你可能会尝试使用 XSLT 将 spark 页面转换为 aspx。除非您使用非常具体的功能。我曾经使用 XSLT 从 XML 生成 C++/C# 库源,所以我认为这对你来说是可能的。这有助于 Spark 识别 语法。但实际上,保留两份副本可能更容易;我不认为您更改母版页太多。
      【解决方案3】:

      这有什么好运气吗?

      我已经能够在火花视图的 System.Web.Mvc.ViewUserControl 调用 Html.RenderView() 中托管火花视图。我敢打赌,我也可以使用 Html.RenderView() 在 System.Web.Mvc.ViewUserControl 中托管 Spark 视图。这引入了一些共享母版页的选项(全部有开销):

      1. 为您的 .spark 视图编写一个简单的包装器 .ascx。他们有相同的模型对象,包装器可以在包装后的视图上调用 HtmlRenderPartial。

      2. (反之亦然)为您的 .ascx 控件编写一个简单的包装器 .spark。

      当我尝试查看 Index.spark 使用母版页 Site.Master 时,我收到错误消息:

      The view 'Index' or its master could not be found. The following locations were searched:
      ~/Views/LfgSettings/Index.aspx
      ~/Views/LfgSettings/Index.ascx
      ~/Views/Shared/Index.aspx
      ~/Views/Shared/Index.ascx
      Layouts\Site.spark
      Shared\Site.spark 
      

      我不知道这些路径代表什么,它看起来像是索引视图的搜索路径和它的母版页的搜索路径。 .spark 文件似乎无法使用 .master 母版页。

      我想知道是否可以编写一个包装器 .master 文件来调用具有正确内容区域的 .spark 文件。一些反射器可能会挖掘出一些可以协同工作的接口。

      【讨论】:

      • 哈哈一样。将我现有的几个页面转换为使用 Spark 很容易,这可能是一种很好的做法。
      【解决方案4】:

      您可以将现有母版页与一个非常简单的 .aspx 页面一起使用,该页面只需调用 Html.RenderPartial("MySparkView") 即可让您在现有母版页中激发内容。

      【讨论】:

        【解决方案5】:

        我完成此操作的方法是将母版页的大部分内容移动到部分视图中,然后有两个母版页:Foo.Master 和 Foo.Master.spark,它们都使用相同的 Html.RenderPartial () 调用。两个母版具有相同命名的内容区域。这让我可以将任一引擎用于给定视图,并使重复尽可能小。

        单个视图引擎应同时处理其主视图和视图。对 IViewEngine 的调用是:

        FindView(System.Web.Mvc.ControllerContext controllerContext, string viewName, string masterName, bool useCache)
        

        它不会将主视图与视图分开。

        Spark 使用它来将 master 编译到视图中,并通过其多通道渲染实现其他技巧。

        【讨论】:

        • 我认为这是一个合理的解决方案。它并不完美,但确实消除了大部分重复。
        • 使用负责渲染主视图和视图的视图引擎,您很难找到没有重复或可维护性问题的任何解决方案(包装每个 spark 视图或 .aspx 视图以便可以渲染与备用引擎)。最好是找到最小化这两者的路线。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多