在加载页面脚本后以块形式呈现脚本 (EPI 8/ MVC)

Render scripts in block after page scripts loads (EPI 8/ MVC)

我正在构建一个动态页面类型,我想根据在特定 ContentArea 中加载的块加载不同的脚本。

这是区域:

[AllowedTypes(new[] { typeof(Types.SomeBlockType)})]
public virtual ContentArea SomeArea { get; set; }

在我的页面视图中,我正在渲染内容和脚本:(脚本渲染是通过布局)

@Html.PropertyFor(...)
.
.
@section Scripts {

    ...//some scripts loaded
}

我遇到的问题是 SomeArea 内容中块内的脚本在脚本部分之前 运行。我希望在加载布局脚本和页面脚本后执行块脚本...

感谢任何帮助。

答案很简单,但首先您的模板必须满足这些客户端资源要求http://world.episerver.com/documentation/Items/Developers-Guide/EPiServer-CMS/75/Client-resources/Client-resources/。文章提到了如何在页面级别注册脚本,在这种情况下,它将被注入到所有符合要求的模板上,即页面类型名称为 XFormPage。

但是假设您只想在页面上使用特定块时注入脚本。一种解决方案是使用文章中的方法,然后遍历页面内容区域中的所有块,看是否使用了该块。可能不是最聪明和最快的解决方案。

一个更简单的解决方案是在块的视图或控制器中要求脚本:

var clientResources = ServiceLocator.Current.GetInstance<IRequiredClientResourceList>();

clientResources.RequireScript("/scripts/my-block-script.js", "BlockScript", new[] { "ScriptNameThatShouldExecuteBefore" }).AtFooter();

如果脚本没有任何依赖关系,您可以传递 Enumerable.Empty() 而不是 new[] { "ScriptNameThatShouldExecuteBefore" }。

最终我做的是设置一个带开关盒的剃须刀块,

它将查看当前的 Model.SomeArea.Items()(或 Contents()),我忘记了,并将查找块类型,将其与我想要的块进行比较,并相应地加载脚本。