Microsoft AJAX: невозможно получить свойство 'x' с неопределенной или нулевой ссылкой

Как устранить неполадки, возникающие в результате следующей ошибки, вызванной методом Microsoft AJAX JavaScript Framework? Это автоматически генерируемая строка JavaScript из пользовательского элемента управления в приложении веб-форм (Sitefinity 5 CMS)

Сообщение об ошибке:

Невозможно получить свойство '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 ответ

Решение

Функция "$create" в ASP.NET Ajax создает экземпляр класса JavaScript. У Microsoft было свое мнение о том, как ориентировать объекты 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" не найдена.

Надеюсь, это поможет, Иван

Другие вопросы по тегам