我正在构建一个动态页面类型,我想根据在某个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()),我忘记了,并将查找块类型,将其与我想要的块进行比较,并相应地加载脚本。