0

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

这是区域:

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

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

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

    ...//some scripts loaded
}

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

感谢任何帮助。

4

2 回答 2

6

答案很简单,但首先您的模板必须满足这些客户端资源要求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" }。

于 2015-08-26T13:31:31.293 回答
0

最终我所做的是用开关盒设置剃须刀块,

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

于 2015-08-28T15:15:30.910 回答