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.

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top