Übergeben Sie ein Array von JavaScript an C # in der Metro-App

8

EDIT: Ich habe eine Antwort gefunden (mit Hilfe von Tejs); siehe unten.

Ich entwickle eine Metro-App mit HTML / Javascript zusammen mit einigen C # -basierten Helferbibliotheken. Im Allgemeinen habe ich eine Menge Erfolg beim Aufrufen von C # -Methoden aus Javascript, aber ich kann nicht scheinen, Arrays (in meinem speziellen Fall Arrays von Strings) zu passieren. Das Übergeben einzelner Strings funktioniert ohne Probleme.

Mein Code ist ungefähr so:

%Vor%

Dann in C #:

%Vor%

Das Problem ist, dass die Methode "Foo" ein Array mit der richtigen Länge bekommt (so im obigen Beispiel, 3), aber alle Elemente sind leer. Ich habe es auch versucht:

%Vor%

Das hat auch nicht funktioniert - das Array hatte wieder die richtige Größe, aber alle Elemente waren null.

Ich habe versucht, String-Literale, String-Variablen übergeben, mit "new Array (...)" in Javascript, die Signatur von "Foo" in "params string []" und "params object []", alle ohne Erfolg.

Da das Passieren einzelner Strings gut funktioniert, kann ich das wahrscheinlich mit etwas Hackerarbeit umgehen ... aber es scheint wirklich, dass das funktionieren sollte. Es scheint mir wirklich seltsam zu sein, dass das Array in der richtigen Größe übergeben wird (d. H. Was auch immer das Marshalling macht, weiß ETWAS über die Javascript-Array-Struktur) und dennoch werden die Inhalte nicht gefüllt.

    
atkretsch 16.05.2012, 18:00
quelle

2 Antworten

1

Der Trick besteht darin, IEnumerable anstelle von string [] zu verwenden. Ersetzen Sie also meinen ursprünglichen Code durch Folgendes:

%Vor%

Beachten Sie auch, dass IEnumerable auch funktioniert, wenn Sie Arrays von etwas anderem als Strings übergeben müssen.

Danke @Tejs für die Inspiration!

    
atkretsch 17.05.2012, 16:59
quelle
2

Die Lösung für Ihr Problem ist sehr einfach, es nimmt nur ein Auge darauf, es zu bemerken. Zuerst müssen Sie die Tatsache berücksichtigen, dass Sie in C # (und möglicherweise auch JavaScript) kein Array von Arrays haben können (zumindest nicht so, wie Sie es tun!) Also in deinem Javascript:

  

var Ergebnis = MyLibrary.MyNamespace.MyClass.foo ([Zeichenfolge1, Zeichenfolge2, Zeichenfolge3]);

und in deinem C #:

  

öffentliche statische Zeichenfolge Foo (Zeichenfolge [] Zeichenfolgen) {

Sie müssen die Methode Foo mehrere Argumente von String-Arrays wie folgt übergeben lassen:

  

öffentliche statische Zeichenfolge Foo (Zeichenfolge [] Zeichenfolge1, Zeichenfolge [] Zeichenfolge2, Zeichenfolge [] Zeichenfolge3) {

Aber wenn Sie ein Array von Arrays erstellen möchten, müssen Sie einen List-Konstruktor verwenden:

  

öffentliche statische Zeichenkette Foo (Liste & lt; Zeichenkette [] & gt; Zeichenketten) {

Aber das Problem mit der obigen Antwort ist, dass Javascript keinen List-Konstruktor hat, also würde ich vorschlagen, mit der ersten Lösung zu gehen, es sei denn, Sie können einen Weg finden, diesen zu beheben!

    
Phxvyper 16.05.2012 18:50
quelle