c# - Orchard 。如何渲染 'HeadScripts' 形状之前的东西?

标签 c# asp.net-mvc orchardcms

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

比方说,我有一个由 C# 服务器端代码和 JS 客户端代码组成的组件。 Component 定义了一些 C# 常量,为特定的 JS 代码提供。这个定义可以在 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”之后呈现。 请帮忙。

最佳答案

我已经设法在“HeadScripts”形状之前呈现自定义字符串。

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 参数呈现的。但是 Output 总是在“HeadScripts”之后呈现。 “HeadScripts”(这是一组“脚本”形状)使用 HtmlHelper Html 参数中的编写器。因此,使用 HtmlHelper Html 允许您在“HeadScripts”之前呈现自定义内容。

关于c# - Orchard 。如何渲染 'HeadScripts' 形状之前的东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32589493/

相关文章:

c# - Form1 的类型初始值设定项抛出异常

c# - 将 UserPrincipal.FindByIdentity 和 PrincipalContext 与嵌套 OU 结合使用

c# - 将文本添加到视频中并保存输出

c# - 显示名称属性与显示属性

c# - 未找到 MaxLength DataAnnontation

orchardcms - 如何改变 Orchard 的外观

c# - 如何在样式内的 WPF DataTemplate 中使用绑定(bind)

asp.net-mvc - Angular4 + MVC + cli + 使用从 cli 构建命令生成的 dist 文件夹进行部署

asp.net - 配置用于 ASP.Net 身份验证的数据库

orchardcms - 如何管理 Orchard 主题中的区域?