Javascript: вызов функции C # - PullRequest
1 голос
/ 27 марта 2012

Во-первых, я много искал, и все темы, похоже, на 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 не показывает ничего, пожалуйста, наведите меня, если я что-то пропустил.

Ответы [ 6 ]

6 голосов
/ 27 марта 2012

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

 I get Error from the webbrowser control :

Это означает, что он встраивает веб-браузер, открывающий эту страницу, которая запускает javascript.

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

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

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

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

window.external.CreateFoo(); 

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

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

webBrowser1.ObjectForScripting = this;

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

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

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

РЕДАКТИРОВАТЬ: Также в качестве напоминания, webBrowserControl зависит от версии наIE, который пользователь установил на своем компьютере.Так что будьте осторожны с версионированием, javascript будет работать только в той степени, в которой его / ее версия IE может обрабатывать (то же самое касается стилей и т. Д.)

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

1 голос
/ 27 марта 2012

Объяснить ответ Джерома С.

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

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

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

1 голос
/ 27 марта 2012

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

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

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

1 голос
/ 27 марта 2012

здесь неправильно понято.

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

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

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

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

0 голосов
/ 27 марта 2012

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

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

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

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

Вы можете прочитать о WebServices связанной с веб-сервисами статье Wiki и об Ajax в Статья Ajax wiki .

Также:

  • Ajax-вызовы не должны быть написаны от руки, могут использоваться такие фреймворки javascript, как jQuery . (в jQuery такая функция, как jQuery. $ ajax () очень полезна при вызовах ajax)
  • Есть альтернативный способ сделать это - вы можете использовать метод страницы .
0 голосов
/ 27 марта 2012

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...