2012-03-27 74 views
1

首先,我搜索了很多,所有主题似乎都是C#:调用或调用JavaScript函数,但我想做相反的事情,我想在C#上创建一个函数,并在JavaScript上创建函数我希望JavaScript函数调用C#函数并检索它的数据,这似乎是一个很好的问题。 的问题是,我对网络一无所知,我不知道它是如何工作的,但我想一个样本: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没有显示任何内容,请指导我,如果我错过了什么。

+2

对这个问题+1来抵消-1:我不认为这个问题应该得到downvote只是因为OP不知道如何特定的技术/协议/框架的作品。 – Michael 2012-03-27 09:15:08

+1

我不低估他的无知,而是因为他模棱两可的问题。 – 2012-03-27 09:18:09

回答

6

抓住家伙。 PAUSE。你们所有人都需要减速并阅读。正如这家伙说:

I get Error from the webbrowser control : 

意思是他嵌入了一个webbrowser控件,打开此页面运行javascript。

要清除这件事,我想他的意思是:

  1. 这是不在线。
  2. 他在他的C#应用​​程序中有一个webBrowserControl,打开一个页面来运行这个javascript。
  3. 在他的应用程序中,他希望使用javascript从他的应用程序中的类调用C#方法。

现在,我都认为他是一个有点暧昧(提示,请与您的问题,下一次更清晰),但你们都张贴答案,走在前面的自己。实际上他所描述的确实是可能的,这就是你如何去做的。

现在你想在javascript中引用的对象是window.external。这里是你的javascript中的一个例子:

window.external.CreateFoo(); 

来调用CreateFoo()。但是,在你这样做之前,你必须让你的类在你的浏览器打开的页面上可见(window.external是你引用的实例类)。

因此,设置的window.external,当你创建在C#中的WebBrowser:

webBrowser1.ObjectForScripting = this; 

所以总结起来:

  1. 在你的C#应用​​程序,设置网络的ObjectForScripting浏览器控制到您想要在Javascript中引用的任何对象。
  2. 在页面上的Javascript中,您可以调用window.external.YOURMETHOD();从最初设置的ObjectForScripting类中调用任何公共方法。

我希望这可以帮助你的情况和其他人在阅读你的问题时会更加小心。

编辑:另外作为提醒,webBrowserControl取决于用户已在他/她的计算机上安装的IE上的版本。所以在版本控制方面要小心,JavaScript只会执行到他/她版本的IE可以处理的程度(同样适用于造型等)

编辑编辑:您还需要添加ComVisible属性[ComVisible( true)]

+0

你非常喜欢你的回答和理解,但是当我将你的解决方案应用到我的表单上时,我设置了webBrowser1.ObjectForScripting = this; 但我得到错误: System.ArgumentException:ObjectForScripting的类必须对COM可见。验证该对象是否公开,或者考虑将ComVisible属性添加到您的类中。 在System.Windows.Forms.WebBrowser.set_ObjectForScripting(对象值) – 2012-03-27 10:23:19

+1

好吧没问题,我已经修复,通过添加: using System.Runtime.InteropServices; [ComVisible(true)] 以上的公共界面 – 2012-03-27 10:29:48

+0

^是的我忘了补充说,你需要ComVisible属性 – 2012-03-27 11:56:05

1

这里有一些误解。

Javascript无法调用服务器功能。

为此使用Ajax。

我们可以考虑的唯一方法就是像GWT这样的框架,但要小心:GWT在JavaScript中编译您的java代码,并通过ajax调用服务器。

内存中的东西是,如果一个框架建议你直接在JavaScript中调用C#或java方法,它并没有真正执行:它使用ajax调用服务器资源,然后服务器资源调用方法。该方法返回并将ajax响应发送给javascript。

+0

杰罗姆,我不认为他意味着这是一个在线应用程序。相反,他将页面嵌入到他的离线C#应用程序中。 – 2012-03-27 09:32:50

+0

是的,我见过你的答案。感谢您指点正确的方向;) – 2012-03-27 12:07:57

1

你应该仔细研究HTTP的工作方式,然后重新评估你的问题。

您无法直接从JavaScript调用C#函数,因为您的JavaScript由浏览器在客户端上执行,而C#由Web服务器在服务器上运行。

如果你想在服务器上调用一个函数,你需要通过一个AJAX请求来使用ASP.NET WebAPI或ASP.NET MVC等Web库。

1

解释杰罗姆C的答案稍微进一步。

C#是服务器端由服务器请求执行的语言。而JavaScript是客户端语言,这意味着它由浏览器处理。两者都有它们的优点,并且两者都是用于相同等东西的验证。例如,服务器端语言是确保某种东西或在数据库之间执行命令的安全方式。客户端语言(JavaScript)更常用于改善用户体验,但使事情更具互动性。

正如人们所说,有两种方法可以在两者之间进行交流,但不是“直接”进行交流。这里的关键词是AJAX。在客户端使用开源库,例如jQuery http://jquery.com/,然后使用自定义处理程序(。ASHX文件)在服务器端,您可以在客户端和服务器之间进行异步请求。

在稍微高级一点的笔记上;你可以直接如SignalR https://github.com/SignalR/SignalR使用库中的JavaScript和C#对象之间的通信,它是一点点繁琐设置,所以我不会推荐它的这种情况下,但它肯定是以后的事要考虑。

+0

非常感谢您的简要回答。 – 2012-03-27 09:16:55

0

您无法直接通过Javascript调用服务器功能。

如果需要,您可以使用__doPostBack("Button1","")代替。

将您的操作置于Button1的事件中。

0

JavaScript和服务器端语言不能直接对话。

最常见的(我认为)的方式来做到这一点是使用某种形式的Ajax调用服务器端Web服务:

这意味着您在JavaScript中的特殊调用,将达到用C#编写一个类的方法。

在阅读和制作Ajax调用之前,您应该阅读HTTP协议以及Web服务器和浏览器之间的通信是如何执行的。我认为文章in this link是开始阅读HTTP的好地方。

你可以阅读关于WebServices Web Services related Wiki article和关于Ajax的文章Ajax wiki Article

另外:

  • Ajax调用不必手工写的,可用于像jQuery JavaScript框架。 (在jQuery中,像jQuery.$ajax()这样的函数在进行ajax调用时非常有用)
  • 有一种替代方法可以做到这一点 - 您可以use a page method