2010-09-23 91 views
6

我使用ObjectForScripting屬性與WebBrowser控件內的網頁進行交互,並且一切正常,但我無法弄清楚如何將字符串數組傳回C#從JS到C#中傳遞字符串數組到WebBrowser控件

HTML代碼

<input type="submit" onclick="window.external.save(Array('test', 'test2'))" /> 

形式

// Returns System.__ComObject 
public void Save(object parameters) 
{ 
} 

// Throws an exception 
public void Save(object[] parameters) 
{ 
} 

// Also throws an exception 
public void Save(string[] parameters) 
{ 
} 
+0

你找到一個工作方法? – Shrike 2011-03-22 15:28:52

+0

不,我讀了許多有關將數組傳回給調用應用程序的負面響應。最後,我結束了重新考慮因素的程序,其中我有多個方法參數而不是數組。 – 2011-03-27 15:56:24

回答

2

而不是打它;也許從另一個角度解決這個問題......你能(而不是,任):

  • 分隔數據(與Array.join),並通過一個單一,並在C#
  • 它( string.Split)分裂
  • 呼叫保存多次,接受單個串中的每個時間(Save(string s)),則調用一個方法最終實際提交更改
+0

我可以。我懷疑你是建議,因爲編組對象從JS到。NET是棘手的,如果解決方法是可行的,不值得。你是? – 2010-09-23 09:37:20

+0

@Sergej差不多,是的。它不想按照你所顯示的方式工作......所以不要這樣做; p – 2010-09-23 09:48:00

0
function JS2VBArray(objJSArray) 
{ 
    var dictionary = new ActiveXObject("Scripting.Dictionary"); 
    for (var i = 0; i < objJSArray.length; i++) 
    { 
     dictionary.add(i, objJSArray[ i ]); 
    } 

    return dictionary.Items(); 
} 

參考:http://msdn.microsoft.com/en-us/library/zsfww439(v=vs.80).aspx

<input type="submit" onclick="window.external.Save(JS2VBArray(['test', 'test2']))" /> 

這應該去的方法。

public void Save(object[] parameters) 
{ 
} 
1

您可以使用匿名對象,而不是在JavaScript端的數組:

<input type="submit" onclick="window.external.save({first: 'test', second: 'test2'})" /> 

在C#側(你需要使用.NET 4.0以上的動態或使用類型。 InvokeMember如果你是在一個較舊的版本):

public void Save(dynamic parameters) 
{ 
    MessageBox.Show(parameters.first); 
    MessageBox.Show(parameters.second); 
} 

未經測試,但我認爲你可以使用反射來發現成員。

也期待在此:http://dotnetacademy.blogspot.fr/2009/11/vbnetcnet-communication-with-javascript.html

+0

它的工作原理和我首選它而不是序列化和反序列化數據。 – ZeroWorks 2016-08-29 16:38:23

0

字符串數組被自動爲逗號分隔的字符串通過。 所以這個電話:

window.external.save(Array('test', 'test2')); 

收到像這樣:

public void save(string fromjs) 
{ 
    string[] result = fromjs.Split(','); 
} 
0

這是一個有點晚了這一點,但通常當我需要傳遞對象,或者在這種情況下陣,我將它們作爲一個JSON字符串。

var sArr = JSON.stringify(myArr); 
window.external(sArr); 

然後我對反序列化回對象/陣列的另一側有一個JavaScriptSerializer

Deserialize JSON with C#