Javascript:调用一个C#函数

本文关键字:一个 函数 调用 Javascript | 更新日期: 2023-09-27 18:29:10

首先,我搜索了很多,所有的主题似乎都是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>

我从网络浏览器控件得到错误:

Error : "external" is null or not an object

但是javascript没有显示任何内容,如果我遗漏了什么,请指导我。

Javascript:调用一个C#函数

抓住伙计们暂停。所有人都需要放慢速度并阅读。正如这家伙所说:

 I get Error from the webbrowser control :

这意味着他正在嵌入一个网络浏览器控件,打开这个运行javascript的页面。

为了澄清这一点,我认为他的意思是:

  1. 这不是联机的
  2. 他在C#应用程序中有一个webBrowserControl,它可以打开一个页面来运行这个javascript
  3. 在他的应用程序中,他想使用javascript从应用程序中的一个类中调用C#方法

现在,我同意他有点模糊(暗示,下次请更清楚地回答你的问题),但你们都在发布答案,超越了自己。事实上,他所描述的确实是可能的,这就是你如何做到的

现在,您想在javascript中引用的对象是window.external

window.external.CreateFoo(); 

调用CreateFoo()。然而,在这样做之前,您必须使您的类对Web浏览器打开的页面可见(window.external是您引用的实例化类)。

因此,要设置window.external,当您在C#中创建webBrowser时:

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。使用开源库,如jQueryhttp://jquery.com/在客户端,然后在服务器端使用自定义处理程序(.ASX文件),可以在客户端和服务器之间发出异步请求。

稍微高级一点的;可以使用SignalR等库直接在JavaScript和C#对象之间进行通信https://github.com/SignalR/SignalR它的设置有点麻烦,所以我不建议在这个例子中使用它,但它肯定是未来需要考虑的问题。

您不能通过Javascript直接调用服务器函数。

如果需要,可以使用__doPostBack("Button1","")

把你的行动放在Button1的活动中。

Javascript和服务器端语言不能直接相互通信。

最常见的(我认为)方法是使用某种Ajax调用服务器端Web服务:

这意味着您在javascript中进行一个特殊调用,该调用将访问用C#编写的类方法。

在阅读和进行Ajax调用之前,您应该先了解HTTP协议以及web服务器和浏览器之间的通信是如何执行的。我认为这个链接中的文章是开始阅读HTTP的好地方。

您可以阅读与WebServices Web Services相关的Wiki文章,以及Ajax Wiki文章中的Ajax。

还有:

  • Ajax调用不必手工编写,可以使用jQuery等javascript框架。(在jQuery中,像jQuery.$ajax()这样的函数在进行ajax调用时非常有用)
  • 还有另一种方法可以做到这一点——您可以使用page方法