Microsoft AJAX:Não foi possível obter a propriedade 'x' de referência indefinida ou nula
-
11-12-2019 - |
Pergunta
Como soluciono o seguinte erro gerado por um método de estrutura JavaScript do Microsoft AJAX?É uma linha de JavaScript gerada automaticamente a partir de um controle de usuário personalizado em um aplicativo Web Forms (Sitefinity 5 CMS)
Mensagem de erro:
Não foi possível obter a propriedade 'FancyBlockDesigner' de referência indefinida ou nula
Aqui está o JavaScript que está gerando o erro:
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"));
});
Em vez de discutir os arquivos ascx e cs que tentam abstrair esse detalhe de mim, quero saber o que esse erro significa.Se eu entender os detalhes, a abstração pode fazer mais sentido.
Solução
A função "$create" no ASP.NET Ajax cria uma instância da classe JavaScript.A Microsoft tinha sua própria opinião sobre como tornar o JavaScript orientado a objetos e, como o tempo mostrou, sua abordagem não era exatamente perfeita.
De qualquer forma, para tentar explicar o que está acontecendo, deixe-me dar uma visão geral de como funciona.Começamos por um controle do lado do servidor que implementa IScriptControl interface que exige dois membros:GetScriptDescriptors e GetScriptReferences.O segundo é bastante simples - permite registrar referências a todos os arquivos JavaScript que você controla.Os GetScriptDescriptors, por outro lado, permitem definir todas as instâncias de classes JavaScript que você deseja usar, bem como definir suas propriedades - inicializá-las, se desejar.
O que o código JavaScript gerado automaticamente que você colou diz é basicamente que você definiu em GetScriptDescriptors que precisará de uma instância do tipo "SitefinityWebApp.Esd.TheLab.SampleHtmlEditor.FancyBlockDesigner" onde deseja que a propriedade Editor seja inicializada.Este código irá procurar um construtor JavaScript parecido com este:
function SitefinityWebApp.Esd.TheLab.SampleHtmlEditor.FancyBlockDesigner(element) {
}
que provavelmente também tem um protótipo definido, algo como:
SitefinityWebApp.Esd.TheLab.SampleHtmlEditor.FancyBlockDesigner.prototype = {
}
Agora, desde o erro que você postou afirma:"Não foi possível obter a propriedade 'FancyBlockDesigner' de referência indefinida ou nula", provavelmente um dos seguintes é o problema:
- Você não incluiu o arquivo JavaScript que contém a classe (construtor + protótipo) que falei acima
- Você esqueceu de adicionar o "FancyBlockDesigner" ao construtor (parece que você tem outro objeto, talvez através de namespaces MS Ajax - "SitefinityWebApp.Esd.TheLab"
- Você não registrou o namespace "SampleHtmlEditor".Certifique-se de que no topo do seu arquivo JS você tenha isto:
Type.registerNamespace("SitefinityWebApp.Esd.TheLab.SampleHtmlEditor");
Portanto, resumindo, a função com o nome "SitefinityWebApp.Esd.TheLab.SampleHtmlEditor.FancyBlockDesigner" não pode ser encontrada.
Espero que isso ajude, Ivan