Microsoft AJAX:无法获取未定义或空引用的属性“x”

时间:2012-09-29 01:05:03

标签: webforms sitefinity microsoft-ajax sitefinity-5

如何解决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文件,而是想知道这个错误意味着什么。如果我理解细节,抽象可能会更有意义。

1 个答案:

答案 0 :(得分:1)

ASP.NET中的“$ create”函数Ajax创建了一个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”的函数。

希望这有帮助, 伊万