Domanda

Abbiamo un'applicazione Windows che contiene un controllo ActiveX WebBrowser. Come parte del normale funzionamento di questa applicazione, vengono apportate modifiche alle pagine visualizzate dal controllo ActiveX WebBrowser. Parte di queste modifiche implica l'impostazione di una variabile JavaScript in una pagina Web caricata nel browser Web ActiveX.

Dobbiamo inizializzare questa variabile in C # (originariamente, il codice VB6 stava inizializzando il valore). Il valore di questa variabile è un oggetto classe visibile a COM.

Tuttavia, per semplicità abbiamo ridotto il problema nell'impostazione di un valore di stringa. La nostra pagina originale coinvolge frame e simili, ma gli stessi problemi si verificano in una pagina come questa:

<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>

Vogliamo accedere alla variabile field e assegnargli un valore. In VB6 il codice per questo era piuttosto semplice:

doc.Script.field = 'newValue'

Tuttavia, in C # abbiamo dovuto ricorrere ad altri trucchi, come questo:

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

Il punto della pagina è verificare se la nostra variabile è stata correttamente assegnata da C #. Fare clic sul pulsante dovrebbe produrre qualsiasi nuovo valore sia stato iniettato da C #. Ad esempio, facendo clic sul pulsante nella pagina viene visualizzato un avviso che mostra: " newValue " ;.

Funziona la prima volta, ma non funziona se ricarichiamo la pagina. Nelle chiamate successive non è possibile impostare il valore della variabile field .

Qualcuno ha mai avuto esperienza con questo tipo di operazione prima?

È stato utile?

Soluzione 3

Questi due articoli ci hanno aiutato a trovare una soluzione al nostro problema. Descrivono le basi di ciò che bisogna sapere:

Automazione del browser Web Microsoft utilizzando C #

Uso delle interfacce di hosting avanzate MSHTML

Quindi abbiamo implementato un'interfaccia DocHostUIHandler e questo ci ha permesso di impostare un UIHandler, permettendoci di fare riferimento al metodo da Javascript.

Altri suggerimenti

Penso che quello che stai cercando sia il metodo eval () in Javascript. Puoi chiamarlo da C # in questo modo:

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

Questo codice valuterà " 1 + 2 " e restituirà " 3 " . Immagino che se dovessi inserirla

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

otterresti quella variabile assegnata a 3 se è globalmente visibile nel file.

Se si utilizza il controllo webBrowser, è possibile assegnare un oggetto c # a proprietà objectForScripting http://msdn.microsoft.com/ it-it / library / system.windows.forms.webbrowser.objectforscripting.aspx

dopo puoi usare window.external nel tuo javascript per interagire con il tuo oggetto c # da javascript

se usi una versione activeX per qualche motivo, puoi passare javascript: urls per impostare programmaticamente la tua variabile, oppure puoi sincronizzare il tuo script usando un servizio web / database / file o semplicemente usando il metodo che hai suggerito.

Il solito metodo che utilizziamo è aggiungere una casella di input di testo nascosta (la versione di controllo ASP.Net) sulla pagina. In questo modo puoi facilmente impostare il suo valore nel codice C # dietro e leggere il valore nel JavaScript lato client (e viceversa, ovviamente).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top