果园。如何在'HeadScripts'形状之前渲染一些东西?

时间:2015-09-15 15:06:12

标签: c# asp.net-mvc orchardcms

有时javascript代码需要来自服务器的一些数据(例如JS和C#之间共享的常量或配置)。我不想通过Ajax提取这些数据。我想将这些数据渲染到服务器上的html页面。

假设我有一个由C#服务器端代码和JS客户端代码组成的组件。 Component定义了为特定JS代码提供的一些C#常量。这个定义可以在ResourceManifest中以某种方式完成。定义的C#常量应该在JS脚本链接之前呈现为html。 JS链接的第一部分以“HeadScripts”形式呈现。

问题是如何在'HeadScripts'形状之前渲染一些东西?

我试图包裹'HeadScripts'的形状。但它没有帮助。

IShapeTableProvider实施中的包装器:

builder.Describe("HeadScripts").Configure(desc => desc.Wrappers.Add("HeadScriptsWrapper"));

HeadScriptsWrapper.cshtml:

<script>
    var ServerConstants = {
        const1: 'value1',
        const2: 'value2'
    };
</script>
@Display(Model.Child)

结果是:

...
<script src="/.../jquery-1.11.1.js" type="text/javascript"></script>
<script src="/.../some.js" type="text/javascript"></script>
<script src="/.../onemore.js" type="text/javascript"></script>
...
<meta content="Orchard" name="generator" />
<meta content="utf-8" name="charset" />
...
<link href="/.../favicon.png" rel="shortcut icon" type="image/x-icon" />
<script>
    var ServerConstants = {
        const1: 'value1',
        const2: 'value2'
    };
</script>

正如您所见,来自包装器的代码在'HeadScripts'之后呈现。 请帮忙。

1 个答案:

答案 0 :(得分:1)

我设法在HeadScripts&#39;之前设置自定义字符串。形状

Column.cast

我无法详细解释此代码,但我发现某些形状是通过public class BeforeHeadScriptsShapeProvider : IShapeTableProvider { private readonly Work<IOrchardServices> orchardServices; public BeforeHeadScriptsShapeProvider(Work<IOrchardServices> orchardServices) { this.orchardServices = orchardServices; } public void Discover(ShapeTableBuilder builder) { builder.Describe("HeadScripts") .OnCreated(created => { orchardServices.Value.WorkContext.Layout.Head.Add(created.New.BeforeHeadScriptsShape()); }); } [Shape] public void BeforeHeadScriptsShape(HtmlHelper Html) { Html.ViewContext.Writer.WriteLine("<script type=\"text/javascript\"> alert('TEST');</script>"); } } 参数呈现的。但TextWriter Output总是在“HeadScripts”之后呈现。 &#39; HeadScripts&#39; (这是一组&#39;脚本&#39;形状)使用来自Output参数的编写器。因此,使用HtmlHelper Html可以在HeadScripts&#39;之前呈现自定义内容。