2012-03-27 5 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> 

Я получаю сообщение об ошибке от элемента управления веб-браузером:

Error : "external" is null or not an object 

Но javascript ничего не показывает, пожалуйста, направляйте меня, если я что-то пропустил.

+2

+1 к этому вопросу, чтобы компенсировать -1: я не думаю, что вопрос должен получить downvote только потому, что OP не знает о том, как работает конкретная технология/протокол/каркас. – Michael

+1

Я ниспослал его не за свое невежество, а за его двусмысленный вопрос. –

ответ

6

Держитесь за ребятишек. PAUSE. Все вам нужно, чтобы замедлялся и читал. Как этот парень сказал:

I get Error from the webbrowser control : 

Значение он встраивание управления WebBrowser, который открывает эту страницу, которая работает JavaScript.

Чтобы выяснить это, я думаю, что он имел в виду, что:

  1. Это не онлайн.
  2. У него есть приложение webBrowserControl в своем приложении C#, которое открывает страницу для запуска этого javascript.
  3. В своем приложении он хочет использовать javascript для вызова метода C# из класса в своем приложении.

Теперь, я согласен, что он был немного неоднозначный (подсказка, пожалуйста понятнее с вашим вопросом в следующий раз), но вы, ребята, все проводки ответов и получить впереди себя. На самом деле то, что он описывает, действительно возможно, и именно так вы это делаете.

Теперь объект, который вы хотите ссылаться в своем javascript, является window.external. Вот пример в вашем javascript:

window.external.CreateFoo(); 

для вызова CreateFoo(). Тем не менее, прежде чем вы сможете это сделать, вы должны сделать свой класс видимым для страницы, которую открывает ваш веб-браузер (window.external - это экземплярный класс, на который вы ссылаетесь).

Таким образом, чтобы установить window.external, когда вы создаете WebBrowser в C#:

webBrowser1.ObjectForScripting = this; 

Так, чтобы подвести итог:

  1. В вашем C# приложение, установите ObjectForScripting вашей сети браузер для любого объекта, который вы хотите ссылаться в Javascript.
  2. В Javascript на вашей странице вы можете позвонить window.external.YOURMETHOD();, чтобы вызвать любой общедоступный метод из этого класса ObjectForScripting, который вы установили первоначально.

Надеюсь, это поможет вашей ситуации, а другие будут немного более осторожны при чтении вашего вопроса.

EDIT: Также как напоминание, webBrowserControl зависит от версии IE, установленной пользователем на его компьютере. Поэтому будьте осторожны при управлении версиями, javascript будет работать только в той мере, в какой его IE может обрабатывать (то же самое относится к стилю и т. Д.)

Редактировать Редактировать: вам также необходимо добавить атрибут ComVisible [ComVisible (true)]

+0

, что вы так много для вашего ответа и понимания, но когда я применил ваше решение в своей форме, я установил webBrowser1.ObjectForScripting = this; Но я получаю ошибку: System.ArgumentException: класс ObjectForScripting должен быть видимым для COM. Убедитесь, что объект является общедоступным, или рассмотрите возможность добавления атрибута ComVisible в ваш класс. at System.Windows.Forms.WebBrowser.set_ObjectForScripting (значение объекта) –

+1

Хорошо, я не исправил это, добавив: using System.Runtime.InteropServices; [ComVisible (true)] над открытым интерфейсом –

+0

^да, я забыл добавить, что вам нужен атрибут ComVisible –

1

здесь есть некоторые недоразумения.

Javascript не может вызвать функцию сервера.

Используйте Ajax для этого.

Единственный способ, которым мы можем думать об этом, - это такая структура, как GWT, но будьте осторожны: GWT скомпилируйте свой Java-код в javascript, который вызывает через ajax сервер.

Вещь в памяти заключается в том, что если структура предложит вам вызвать метод C# или java непосредственно в javascript, она на самом деле не выполняет этого: он вызывает ресурс сервера с помощью ajax, а затем серверный ресурс вызывает метод , Метод возвращается, и ответ ajax отправляется на javascript.

+0

Джером, я не думаю, что он означает, что это онлайн-приложение. Вместо этого он встраивает страницу в свое офлайн-приложение C#. –

+0

Да, я видел ваш ответ. Спасибо, чтобы указать нам в правильном направлении;) –

1

Вы должны действительно посмотреть, как работает HTTP, а затем переоценить ваш вопрос.

Вы просто не можете вызвать функцию C# непосредственно из JavaScript, потому что ваш JavaScript выполняется на клиенте браузером, а C# запускается на сервере веб-сервером.

Если вы хотите вызвать функцию на сервере, вам нужно сделать это с помощью запроса AJAX, используя какую-то веб-библиотеку, такую ​​как ASP.NET WebAPI или ASP.NET MVC.

1

Чтобы объяснить ответ Джерома С немного дальше.

C# является серверный сервер, который выполняется по запросу сервера. В то время как JavaScript - это клиентский язык, то есть он обрабатывается браузером. Оба имеют свои преимущества, и оба они обычно используются для таких же, таких как проверка. Язык на стороне сервера является безопасным способом обеспечения чего-либо или выполнения команды между базой данных, например. В то время как язык на стороне клиента (JavaScript) чаще используется для улучшения пользовательского интерфейса, но делает работу более интерактивной.

Как предполагают люди, существуют способы общения между ними, но не «напрямую». Ключевым словом здесь является AJAX. Используя библиотеку с открытым исходным кодом, такую ​​как jQuery http://jquery.com/ на стороне клиента, а затем пользовательский обработчик (.ASHX) на серверной стороне, вы можете создавать асинхронные запросы между клиентом и сервером.

На немного более продвинутом примечании; вы можете напрямую общаться между объектами JavaScript и C#, используя библиотеку, такую ​​как SignalR https://github.com/SignalR/SignalR, это немного сложнее настроить, поэтому я бы не рекомендовал ее для этого экземпляра, но это определенно было бы что-то, что нужно учитывать в будущем.

+0

Большое вам спасибо за ваш краткий ответ. –

0

Вы не можете напрямую вызвать функцию сервера по Javascript.

Если вам нужно, вы можете использовать __doPostBack("Button1","").

Поместите свое действие в событие Button1.

0

Javascript и serveride языки не могут напрямую разговаривать друг с другом.

Наиболее распространенным (я думаю) способ сделать это с помощью какой-то Ajax вызова на стороне сервера веб-службы:

Это означает, что вы сделать специальный вызов в JavaScript, который достигнет к методу класса, написанной в C# ,

Прежде чем читать и делать вызовы Ajax, вы должны прочитать протокол HTTP и как выполняется обмен данными между веб-сервером и браузерами. Я думаю, статья in this link - хорошее место, чтобы начать читать о HTTP.

Вы можете прочитать о WebServices Web Services related Wiki article и об Ajax в Ajax wiki Article.

также:

  • Ajax звонки не должны быть написаны вручную, можно использовать JavaScript рамки как jQuery. (в jQuery функция, подобная jQuery.$ajax(), очень полезна при создании вызовов ajax)
  • Существует альтернативный способ сделать это - вы можете use a page method.
Смежные вопросы