Pergunta

Nós temos um aplicativo do Windows que contém um controle ActiveX WebBrowser. Como parte da operação regular desta aplicação modificações são feitas para as páginas que são exibidos pelo controle ActiveX WebBrowser. Parte destas alterações envolvem a definição de uma variável JavaScript em uma página da Web que está sendo carregado no ActiveX WebBrowser.

Precisamos inicializar esta variável dentro C # (originalmente, código VB6 foi inicializar o valor). O valor dessa variável é um objeto de classe COM-visível.

No entanto, para simplificar, nós reduzimos o problema de fixar um valor string. Nossa página original envolve quadros e similares, mas os mesmos problemas acontece em uma página como esta:

<HTML>
 <HEAD>
  <TITLE>Test</TITLE>
  <SCRIPT type="text/javascript">
   var field = 'hello world';
  </SCRIPT>
 </HEAD>
 <BODY>
   <input type="button" value="See field" onclick="javascript:alert(field);"/>
 </BODY>
</HTML>

Queremos acessar o campo variável e atribuir um valor a ela. Em VB6 o código para isso era bastante simples:

doc.Script.field = 'newValue'

No entanto, em C # nós tivemos que recorrer a outros truques, como este:

Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateSet(Script, null, "field",new object[] { "newValue"},null, null);

O ponto da página é para testar se nossa variável foi devidamente atribuído pela C #. Clicando no botão deve render tudo o novo valor foi injetado por C #. Assim, por exemplo, clicando no botão na página que receber um alerta mostrando: "newValue"

Isso funciona na primeira vez, mas ele não funciona se recarregar a página. Em chamadas subseqüentes não podemos definir o valor do field variável.

Alguém já teve alguma experiência em fazer esse tipo de operação antes?

Foi útil?

Solução 3

Esses dois artigos nos ajudou a encontrar uma solução para o nosso problema. Eles descrevem o básico do que é preciso saber:

Automação Navegador Microsoft Web usando C #

Usando MSHTML, Advanced Hospedagem Interfaces

Então, nós implementamos uma interface DocHostUIHandler e que nos permitiu definir um UIHandler, permitindo-nos para fazer referência ao método de Javascript.

Outras dicas

Eu acho que o que você está procurando é o método eval() em Javascript. Você pode chamá-lo de C # como este:

webBrowser1.Document.InvokeScript("eval", new String[] {"1 + 2"});

Este código irá avaliar "1 + 2" e "3" retorno. Imagino que se você fosse para colocar em

InvokeScript("eval", new String[] {"varName = 3"})

você teria essa variável atribuído a 3 se é globalmente visível no arquivo.

Se você usar o controle WebBrowser, você pode atribuir um objeto c # para o ObjectForScripting propriedade http://msdn.microsoft.com/ en-us / library / system.windows.forms.webbrowser.objectforscripting.aspx

depois que você pode usar window.external em seu javascript para interagir com seus c # objeto de javascript

Se você usar uma versão de ActiveX, por algum motivo, você pode passar javascript:. Urls para programaticamente define sua variável, ou você pode sincronizar seu script usando um webservice / banco de dados / arquivo ou simplesmente usando o método que você sugeriu

O método usual que usamos é para adicionar uma caixa de entrada de texto oculto (a versão de controle ASP.Net) na página. Dessa forma, você pode facilmente configurar o seu valor no C # codebehind e leia o valor no lado do cliente JavaScript (e vice-versa, é claro).

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