2010-09-23 22 views
6

Tôi đang sử dụng thuộc tính ObjectForScripting để tương tác với trang web bên trong điều khiển WebBrowser và mọi thứ hoạt động tốt ngoại trừ tôi không thể tìm ra cách truyền mảng trở lại C#Truyền mảng chuỗi từ JS đến C# bên trong điều khiển WebBrowser

HTML code

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

Mẫu

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

Bạn đã tìm thấy một cách tiếp cận làm việc? – Shrike

+0

No. Tôi đọc nhiều phản hồi tiêu cực về việc truyền lại mảng trở lại ứng dụng gọi điện. Cuối cùng tôi đã kết thúc với chương trình tái hiện thực, nơi tôi có nhiều đối số phương thức thay vì mảng. –

Trả lời

2

Thay vì chiến đấu với nó; có lẽ tiếp cận vấn đề từ một góc độ khác ... có thể giúp bạn (thay vào đó, một trong hai):

  • phân định các dữ liệu (với Array.join) và vượt qua một đơn chuỗi, và chia nó (string.Split) trong C#
  • gọi Lưu nhiều lần, chấp nhận một chuỗi duy nhất mỗi lần (Save(string s)), sau đó gọi một phương pháp cuối cùng để thực sự cam kết những thay đổi
+0

Tôi có thể. Tôi nghi ngờ bạn đang gợi ý rằng vì các đối tượng marshaling từ JS đến.NET là khôn lanh và không có giá trị nó nếu workaround là có thể. Bạn có phải? –

+0

@Sergej khá nhiều, vâng. Nó không muốn làm việc theo cách bạn đang hiển thị ... do đó, không làm điều đó, p –

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(); 
} 

tham khảo: http://msdn.microsoft.com/en-us/library/zsfww439(v=vs.80).aspx

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

Điều này nên đi đến phương pháp.

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

Bạn có thể sử dụng một đối tượng vô danh thay vì một mảng ở phía bên javascript:

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

Trên C# bên (bạn cần sử dụng .NET 4.0 hoặc nhiều hơn cho các loại động hoặc sử dụng. InvokeMember nếu bạn đang sử dụng phiên bản cũ hơn):

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

Không kiểm tra, nhưng tôi nghĩ bạn có thể sử dụng phản ánh để khám phá các thành viên.

Cũng xem xét điều này: http://dotnetacademy.blogspot.fr/2009/11/vbnetcnet-communication-with-javascript.html

+0

Nó làm việc và tôi thích nó thay vì serializing và unserializing dữ liệu. – ZeroWorks

0

Mảng chuỗi được tự động chuyển dưới dạng chuỗi bằng dấu phẩy phân cách. Vì vậy, cuộc gọi này:

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

Được nhận như vậy:

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

Đó là hơi muộn cho điều này, nhưng thông thường khi tôi cần phải vượt qua các đối tượng hoặc, trong trường hợp này Mảng, tôi vượt qua chúng như một chuỗi JSON.

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

Sau đó, tôi có một JavaScriptSerializer ở phía bên kia mà deserializes nó trở lại vào một đối tượng/mảng.

Deserialize JSON with C#

Các vấn đề liên quan