2013-04-03 84 views
1

我有一個javascript文件,我有一個方法「測試」,我喜歡調用c#函數。從JavaScript文件(.js文件)調用c#函數(.cs文件)

c#函數與javascript文件中的文件不在同一個文件中。

它在一個.cs文件中。那麼我該如何管理javascript函數能夠調用c#函數呢?

我已經在互聯網上搜索,但大多數解決方案都基於一個ASPX和apx.cs文件...

我想是這樣的:

viewer.js

function Test() { 
alert("Hello world-2"); 
window.external.MethodToCallFromScript(); 
} 

ScriptManager.cs

[ComVisible(true)] 
    public class ScriptManager 
    { 
     public void MethodToCallFromScript() 
     { 
      Debug.WriteLine("test"); 
     } 
    } 

但它沒有工作...

有人能幫助我嗎?

謝謝!

+0

你使用的是asp.net嗎? –

+1

你想做什麼? – Hilmi

+0

我想有兩個獨立的文件,像我現在有: 一個.cs文件,其中我的功能是(此時只是一個消息框顯示「你好世界」,但後來它不僅僅是 - > HTTPWebrequest) 和a .js文件,我可以打電話給我的C#函數... –

回答

1

爲了使這項工作,您必須設置WebBrwoser-控制ObjectForScripting屬性。

下面是一個例子

using System; 
using System.Windows.Forms; 
using System.Security.Permissions; 

[PermissionSet(SecurityAction.Demand, Name="FullTrust")] 
[System.Runtime.InteropServices.ComVisibleAttribute(true)] 
public class Form1 : Form 
{ 
    private WebBrowser webBrowser1 = new WebBrowser(); 
    private Button button1 = new Button(); 

    [STAThread] 
    public static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.Run(new Form1()); 
    } 

    public Form1() 
    { 
     button1.Text = "call script code from client code"; 
     button1.Dock = DockStyle.Top; 
     button1.Click += new EventHandler(button1_Click); 
     webBrowser1.Dock = DockStyle.Fill; 
     Controls.Add(webBrowser1); 
     Controls.Add(button1); 
     Load += new EventHandler(Form1_Load); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     webBrowser1.AllowWebBrowserDrop = false; 
     webBrowser1.IsWebBrowserContextMenuEnabled = false; 
     webBrowser1.WebBrowserShortcutsEnabled = false; 
     webBrowser1.ObjectForScripting = this; 
     // Uncomment the following line when you are finished debugging. 
     //webBrowser1.ScriptErrorsSuppressed = true; 

     webBrowser1.DocumentText = 
      "<html><head><script>" + 
      "function test(message) { alert(message); }" + 
      "</script></head><body><button " + 
      "onclick=\"window.external.Test('called from script code')\">" + 
      "call client code from script code</button>" + 
      "</body></html>"; 
    } 

    public void Test(String message) 
    { 
     MessageBox.Show(message, "client code"); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     webBrowser1.Document.InvokeScript("test", 
      new String[] { "called from client code" }); 
    } 

} 

而且here是鏈接。

+0

感謝您的解決方案,但我實際上我不想要我的C#代碼中的HTML代碼它需要兩個單獨的文件... –

+0

該示例中的重要行是一個:'webBrowser1.ObjectForScripting = this;';定義一個類,創建一個對象並將其傳遞給'ObjectForScripting'。另請參閱我提供的鏈接以進行說明 –