我正在构建一个 GUI 扩展,其中包括一个弹出窗口,该弹出窗口在单击功能区栏中的新按钮时打开。弹出窗口包括一个下拉列表,其中动态填充了使用核心服务从系统收集的一些信息。至少是这样的想法。我能够让按钮出现,它会打开弹出窗口,但是一旦我从弹出窗口的 javascript 开始,我就会收到一个错误Unable to get unique id for element
,并且 CME 没有完成加载。这是我到目前为止所拥有的:
弹出 ASPX
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="SwitchUserPopup.aspx.cs" Inherits="SwitchUser.Popups.SwitchUserPopup" %>
<%@ Import Namespace="Tridion.Web.UI.Core" %>
<%@ Import Namespace="Tridion.Web.UI" %>
<%@ Import Namespace="System.Web" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:c="http://www.sdltridion.com/web/ui/controls">
<head runat="server">
<title>Select User</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<h1>Select User</h1>
<c:dropdown id="SwitchUserDropdown" runat="server" nullable="false"/>
</div>
</form>
</body>
</html>
弹出 ASPX 代码
namespace SwitchUser.Popups
{
[ControlResourcesDependency(new [] { typeof(Popup),
typeof(Tridion.Web.UI.Controls.Button),
typeof(Stack),
typeof(Dropdown),
typeof(List) })]
[ControlResources("SwitchUser.Resources")]
public partial class SwitchUserPopup : TridionPage
{
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
TridionManager tm = new TridionManager();
tm.Editor = "SwitchUser";
System.Web.UI.HtmlControls.HtmlGenericControl dep =
new System.Web.UI.HtmlControls.HtmlGenericControl("dependency");
dep.InnerText = "Tridion.Web.UI.Editors.CME";
tm.dependencies.Add(dep);
System.Web.UI.HtmlControls.HtmlGenericControl dep2 =
new System.Web.UI.HtmlControls.HtmlGenericControl("dependency");
dep2.InnerText = "Tridion.Web.UI.Editors.CME.commands";
tm.dependencies.Add(dep2);
//Add them to the Head section
this.Header.Controls.Add(tm); //At(0, tm);
}
}
}
弹出式JS
Type.registerNamespace("SwitchUser.Popups");
SwitchUser.Popups.SwitchUser = function (element) {
Type.enableInterface(this, "SwitchUser.Popups.SwitchUser");
this.addInterface("Tridion.Cme.View");
};
SwitchUser.Popups.SwitchUser.prototype.initialize = function () {
$log.message("Initializing Switch User popup...");
this.callBase("Tridion.Cme.View", "initialize");
var p = this.properties;
var c = p.controls;
c.UserDropdown = $controls.getControl($("#SwitchUserDropdown"), "Tridion.Controls.Dropdown");
};
$display.registerView(SwitchUser.Popups.SwitchUser);
扩展名已正确配置System.config
- 我可以在 javascript 控制台中看到日志消息。但是,我还看到此Unable to get unique id for element
错误以及以下附加信息:
匿名(object{..})
WebRequest.completed(object{..})
Net.loadFile$onComplete(object{..})
Net.loadFile$onOperationCompleted()
Xml.loadXmlDocuments$onSuccess(array 1 )
Xml.loadXmlDocument$ onSuccess(array 1 )
Dropdown.setup$filesLoaded(object{..})
setupDone()
anonymous(function: DisplayController$start())
DisplayController.start()
anonymous()
anonymous(undefined, "Tridion.Controls.Dropdown")
Tridion.Assert$raiseError("无法获取元素的唯一 ID。")
从记录的信息来看,问题似乎出在下拉菜单上。如果我注释掉我的 JS 中注册视图的行,那么我不会收到错误消息,但我也不会收到日志消息,所以我怀疑这是一个强制调用。谁能解释为什么会发生这种情况?我一直在使用示例 PowerTool 代码作为参考,我相信我已经复制了那里的内容......
更新
我试图单步执行代码 - 我找到了合适的行并在那里放置了一个断点。然后我重新加载了 CME,突然我的断点在与我的代码无关的行上,我找不到任何与我的代码相关的东西。但是,根据控制台,它仍在执行中。
因此,我将日志消息放在我的初始化方法中,如下所示:
SwitchUser.Popups.SwitchUser.prototype.initialize = function () {
$log.message("Initializing Switch User popup...");
this.callBase("Tridion.Cme.View", "initialize");
$log.message("Tridion.Cme.View callBase done");
var p = this.properties;
var c = p.controls;
$log.message("Set properties and controls");
c.UserDropdown = $controls.getControl($("#SwitchUserDropdown"), "Tridion.Controls.Dropdown");
$log.message("Got UserDropdown control");
};
我可以在控制台中看到它记录到Set properties and controls
然后我得到错误。