[英]Javascript : call a C# function
首先,我進行了大量搜索,所有主題似乎都是C#:調用或調用JavaScript函數,但是我想做相反的事情,我想在C#和JavaScript上創建一個函數,並且我希望JavaScript函數調用C#函數並檢索它的數據,似乎是一個很好的問題。 問題是我不了解網絡,也不知道它是如何工作的,但是我嘗試了一個示例:
創建了一個類:
public interface IFoo
{
string Bar { get; set; }
}
public class Foo : IFoo
{
public string Bar { get; set; }
}
然后
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public IFoo CreateFoo()
{
return new Foo() { Bar = "somevalue" };
}
public string Bar(IFoo foo)
{
return foo.Bar;
}
}
和Javascript代碼:
<script type="text/javascript" language="javascript" >
function Callme(){
alert('Js function start . keep pressing OK')
var foo = external.CreateFoo();
alert(foo.Bar);
foo.Bar = "qwer";
alert(external.Bar(foo));
}
</script>
我從webbrowser控件中得到錯誤:
Error : "external" is null or not an object
但是javascript沒有顯示任何內容,如果我錯過了任何內容,請指導我。
等一下 暫停 。 你們所有人都需要放慢速度並閱讀 。 就像這個家伙說的:
I get Error from the webbrowser control :
表示他正在嵌入一個Web瀏覽器控件,該控件打開了運行javascript的頁面。
為了澄清這一點,我認為他的意思是:
現在,我同意他有點模棱兩可 (提示,下一次請澄清您的問題),但是你們大家都在發布答案,超越自己。 實際上,他所描述的確實是可能的,而這就是您的方式。
現在您要在javascript中引用的對象是window.external。 這是您的javascript中的示例:
window.external.CreateFoo();
調用CreateFoo()。 但是,在這樣做之前,您必須使您的類對Web瀏覽器正在打開的頁面可見(window.external是您所引用的實例化類)。
因此,要在C#中創建webBrowser時設置window.external:
webBrowser1.ObjectForScripting = this;
總結一下:
window.external.YOURMETHOD();
從您最初設置的ObjectForScripting類中調用任何公共方法。 希望這對您有幫助,其他人在閱讀問題時會更加謹慎。
編輯:還要提醒一下,webBrowserControl取決於用戶已在他/她的計算機上安裝的IE版本。 因此,在版本控制上要格外小心,javascript只會在其版本的IE可以處理的范圍內發揮作用(樣式等也是如此)。
編輯編輯:您還需要添加ComVisible屬性[ComVisible(true)]
這里有些誤會。
Javascript無法調用服務器功能。
為此使用Ajax。
我們可以考慮的唯一方法是在GWT之類的框架中,但要小心:GWT在javascript中編譯Java代碼,而javascript是通過ajax服務器調用的。
內存中存在的問題是,如果框架建議您直接使用javascript調用C#或java方法,則它實際上並不會執行該操作:它使用ajax調用服務器資源,然后服務器資源調用該方法。 該方法返回,並且ajax響應發送到javascript。
您應該真正研究HTTP的工作原理,然后重新評估您的問題。
您根本無法直接從JavaScript調用C#函數,因為您的JavaScript是由瀏覽器在客戶端上執行的,而C#是由Web服務器在服務器上運行的。
如果要在服務器上調用函數,則需要使用某種Web庫(例如ASP.NET WebAPI或ASP.NET MVC)通過AJAX請求來實現。
為了進一步解釋Jerome C的答案。
C#是由服務器請求執行的服務器端語言。 JavaScript是客戶端語言,這意味着它是由瀏覽器處理的。 兩者都有自己的優勢,並且通常用於同一事物,例如驗證。 服務器端語言是確保某些內容或在數據庫之間執行命令的安全方式。 客戶端語言(JavaScript)更常用於改善用戶體驗,但使事情更具交互性。
正如人們所建議的那樣,有兩種方法可以在兩者之間進行通信,但不能“直接”進行通信。 這里的關鍵詞是AJAX。 使用客戶端上的jQuery http://jquery.com/等開源庫,然后在服務器端上使用自定義處理程序(.ASHX文件),可以在客戶端和服務器之間發出異步請求。
稍稍先進一點; 您可以使用諸如SignalR https://github.com/SignalR/SignalR之類的庫直接在JavaScript和C#對象之間進行通信,這有點麻煩,所以我不建議在此實例中使用它,但是絕對可以將來要考慮的事情。
您不能直接使用Javascript調用服務器功能。
如果需要,可以改用__doPostBack("Button1","")
。
將您的操作放入Button1的事件中。
Javascript和服務器端語言無法直接相互交流。
我認為最常見的方法是使用某種Ajax調用服務器端Web服務:
這意味着您使用javascript進行了特殊調用,該調用將到達用C#編寫的類方法。
在閱讀和進行Ajax調用之前,您應該閱讀HTTP協議,以及如何執行Web服務器與瀏覽器之間的通信。 我認為此鏈接中的文章是開始閱讀有關HTTP的好地方。
您可以在Ajax Wiki文章中閱讀有關WebServices Web Services的相關Wiki文章 ,以及有關Ajax的信息 。
另外:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.