2

如何解决 Microsoft AJAX JavaScript 框架方法引发的以下错误?它是从 Web 表单应用程序(Sitefinity 5 CMS)中的自定义用户控件自动生成的 JavaScript 行

错误信息:

无法获取未定义或空引用的属性“FancyBlockDesigner”

这是引发错误的 JavaScript:

Sys.Application.add_init(function() {
    $create(SitefinityWebApp.Esd.TheLab.SampleHtmlEditor.FancyBlockDesigner, null, null, {"Editor":"propertyEditor_ctl00_ctl00_ctl00_ctl00_ctl00_Editor","propertyEditor":"propertyEditor"}, $get("propertyEditor_ctl00_ctl00_ctl00"));
});

与其讨论试图从我这里抽象出这些细节的 ascx 和 cs 文件,我想知道这个错误意味着什么。如果我理解细节,抽象可能更有意义。

4

1 回答 1

2

ASP.NET Ajax 中的“$create”函数创建一个 JavaScript 类的实例。微软对如何使 JavaScript 面向对象有自己的看法,而且随着时间的推移,他们的方法并不完美。

无论如何,为了解释正在发生的事情,让我概述一下它是如何工作的。我们从实现IScriptControl接口的服务器端控件开始,该接口需要两个成员:GetScriptDescriptors 和 GetScriptReferences。第二个非常简单——它允许您注册对您控制所需的所有 JavaScript 文件的引用。另一方面,GetScriptDescriptors 让您定义要使用的 JavaScript 类的所有实例,并允许您设置它们的属性 - 如果您愿意,可以初始化它们。

您粘贴的自动生成的 JavaScript 代码基本上是您在 GetScriptDescriptors 中定义的,您需要一个类型为“SitefinityWebApp.Esd.TheLab.SampleHtmlEditor.FancyBlockDesigner”的实例,您希望在其中初始化 Editor 属性。这段代码将寻找一个如下所示的 JavaScript 构造函数:

function SitefinityWebApp.Esd.TheLab.SampleHtmlEditor.FancyBlockDesigner(element) {

}

很可能还定义了一个原型,例如:

SitefinityWebApp.Esd.TheLab.SampleHtmlEditor.FancyBlockDesigner.prototype = {

}

现在,由于您发布的错误指出:“无法获取未定义或空引用的属性'FancyBlockDesigner'”,很可能是以下问题之一:

  • 您没有包含包含我上面讨论过的类(构造函数 + 原型)的 JavaScript 文件
  • 您忘记将“FancyBlockDesigner”添加到构造函数(似乎您确实有其他对象,可能是通过 MS Ajax 命名空间 - “SitefinityWebApp.Esd.TheLab”
  • 您尚未注册“SampleHtmlEditor”命名空间。确保在 JS 文件的顶部有以下内容:Type.registerNamespace("SitefinityWebApp.Esd.TheLab.SampleHtmlEditor");

因此,长话短说,找不到名为“SitefinityWebApp.Esd.TheLab.SampleHtmlEditor.FancyBlockDesigner”的函数。

希望这会有所帮助,伊万

于 2012-09-29T10:46:30.773 回答