不确定这是一个错误还是2sxc故意这么做,"原因">
首先,这是目标。我在一个2sxc应用程序中,在一个使用Razor/C#的视图中。我需要在<头部>像这样:
<script src="//unpkg.com/@dnncommunity/dnn-elements/dist/dnn/dnn.esm.js"
type="module" async="async" defer="defer" crossorigin="anonymous">
</script>
显然,如果我只是照原样放进去,它会出现在页面上,但不会出现在<头部>。
如果我添加属性data-enableoptimizations="true"
,则它在<头部>但我所有的4个属性都被剥离了:
<script src="https://unpkg.com/@dnncommunity/dnn-elements/dist/dnn/dnn.esm.js" type="text/javascript"></script>
此外,请注意,src只有前导"//取消打包&";,并且由于某种原因,优化增加了";https:";这是我不想要的。
type="text/javascript"
是从哪里来的?这已经多年没有被要求了。
我可以在主题/皮肤中使用这样的DnnJsInclude控件来解决这个问题。它使用ClientResourceManagement,并允许我指定HtmlAttributesAsString中的所有属性,如下所示:
<dnn:DnnJsInclude
FilePath="//unpkg.com/@dnncommunity/dnn-elements/dist/esm/dnn.js"
ForceProvider="DnnPageHeaderProvider"
HtmlAttributesAsString="type:module,async:async,defer:defer,crossorigin:anonymous"
Priority="1001"
runat="server"
/>
这给了我正确的结果,但这意味着我的标准内容编辑器现在需要能够编辑页面设置来使用我的2sxc应用程序。这是我不想要的(权限或训练复杂性(。
我意识到我可能可以使用Razor代码中的DnnJsInclude控件,但这似乎是data-enableoptimizations
应该处理的有效用例。对不大概也许它已经做到了,但我不知道正确的语法?
有人知道如何让2sxc做到这一点吗?或者这是一个值得报告的关于data-enableoptimizations
的错误吗?我特别惊讶的是,它只是剥夺了我的有效属性。
因此,对于某些背景:一旦设置了属性,就会将其拾取并拆开,因为DNN需要逐个给定的部分,而不是作为<script>
标记。
我认为,到目前为止,还没有任何机制试图保留剩余的比特。我们已经很久没有研究过这个了,也许在v7.4.2(我们的最低兼容性(中缺少DNN API。
但总的来说:这是目前的设计,可以改进。我建议你在github上打开一个问题和/或做出改变;(
好吧,所以我用DnnJsInclude控件在代码中解决了这个问题。以下是简单的解决方案:
@using DotNetNuke.Web.Client.ClientResourceManagement
@{
// Add a <script> tag in the head as a JS module
var include = new DnnJsInclude
{
FilePath = "https://unpkg.com/@dnncommunity/dnn-elements/dist/dnn/dnn.esm.js",
ForceProvider = "DnnPageHeaderProvider",
Priority = 1001, // stay out of the way?
HtmlAttributesAsString = "type:module,async:async,defer:defer,crossorigin:anonymous",
};
var loader = (Context.CurrentHandler as Page).FindControl("ClientResourceIncludes");
if (loader != null)
{
loader.Controls.Add(include);
}
}
由于HtmlAttributesAsString
参数,它可以获得所需的精确输出。
我甚至把它写成了一篇博客文章,里面有很多细节。
DNN细节004:在2sxc视图中使用新的DNN元素?
由于这依赖于Dnn,因此对Oqtane/混合编码器没有好处。