簡體   English   中英

Javascript:調用C#函數

[英]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的頁面。

為了澄清這一點,我認為他的意思是:

  1. 這不是在線的。
  2. 他的C#應用​​程序中有一個webBrowserControl,可打開一個頁面來運行此javascript。
  3. 在他的應用程序中,他想使用javascript從他的應用程序中的類調用C#方法。

現在,我同意他有點模棱兩可 (提示,下一次請澄清您的問題),但是你們大家都在發布答案,超越自己。 實際上,他所描述的確實是可能的,而這就是您的方式。

現在您要在javascript中引用的對象是window.external。 這是您的javascript中的示例:

window.external.CreateFoo(); 

調用CreateFoo()。 但是,在這樣做之前,您必須使您的類對Web瀏覽器正在打開的頁面可見(window.external是您所引用的實例化類)。

因此,要在C#中創建webBrowser時設置window.external:

webBrowser1.ObjectForScripting = this;

總結一下:

  1. 在C#應用程序中,將Web瀏覽器控件的ObjectForScripting設置為要在Javascript中引用的任何對象。
  2. 在頁面上的Javascript中,您可以調用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的信息

另外:

  • Ajax調用不必手工編寫,可以使用jQuery之類的javascript框架。 (在jQuery中,像jQuery。$ ajax()這樣的函數在進行ajax調用時非常有用)
  • 有另一種方法可以執行此操作-您可以使用頁面方法

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM