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

假设,我有一个由C#服务器端代码和JS客户端代码组成的组件。组件定义了一些为特定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”之后呈现。
请帮忙。

最佳答案

我设法在“ 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参数的writer。因此,使用HtmlHelper Html允许您在“ HeadScripts”之前呈现自定义内容。

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

10-13 06:08