Передача строки / JSON из C # в JS с использованием CefSharp

#javascript #c# #json #wpf #cefsharp

#javascript #c# #json #wpf #cefsharp

Вопрос:

У меня есть html-страница, которую я хочу разместить в своем приложении на C # (WPF). поскольку мне нужно, чтобы браузер был основан на Chromium, я использую CefSharp.

Я хочу передать строковые данные из C # в JS для инициализации страницы.

Я нашел RegisterJsObject , который позволяет мне получить доступ к объекту C # из JS, но, похоже, я не могу передать из него какую-либо строковую информацию.

Мой код в настоящее время выглядит примерно так:

C#:

 mainWindow.browser.RegisterJsObject("csobj", "a string");
  

JS:

 ...
console.log(JSON.stringify(window.csobj)); //I get an empty obj {}
  

Я также пытался определить свой собственный объект с помощью public string GetJson() метода, но тогда JS не распознает его как функцию, я полагаю, потому что он ожидает public void подписи.

Есть ли способ сделать это?

Для справки, я на самом деле пытаюсь передать длинный список слов для целей автозаполнения, поэтому это будет не просто «строка».

Ответ №1:

Проблема в вашем коде: вы неправильно регистрируете объект Js, и именно поэтому вы не можете получить объект в JS.

Инструкция:

RegisterJsObject заключается в регистрации вашего объекта c #, а затем вызове этих методов из JS и отправке значений из JS в c #.

Если вы хотите передать пустую строку из c # на свою HTML-страницу, вам следует зарегистрировать объект JS, как показано ниже:

Ваш класс c # должен быть таким, как показано ниже:

 public class AsyncBoundObject
{
    //We expect an exception here, so tell VS to ignore
    [DebuggerHidden]
    public void Error()
    {
        throw new Exception("This is an exception coming from C#");
    }

    //We expect an exception here, so tell VS to ignore
    [DebuggerHidden]
    public int Div(int divident, int divisor)
    {
        return divident / divisor;
    }
}
  

Затем вы можете зарегистрировать этот класс в экземпляре CefSharp, как показано ниже:

 browser = new ChromiumWebBrowser();
browser.RegisterAsyncJsObject("boundAsync", new AsyncBoundObject()); 
  

После того, как они зарегистрированы, вы можете вызвать метод из JS, как показано ниже.

 function asyncDivOk()
{
    var call = "Async call (Divide 16 / 2): "   Date();
    window.boundAsync.div(16, 2).then(function (res)
    {
        var end = "Result: "   res   "("   Date()   ")";
        writeAsyncResult(call, end);
    });
}
  

Вы можете видеть, что 16 и 2 — это параметры, которые передаются.

Надеюсь, это поможет.

Комментарии:

1. Спасибо за ваш ответ! но, похоже, я не могу заставить ваш пример работать — для меня он выдает «Uncaught TypeError: window.boundAsync.div(…).then не является функцией». есть идеи, как это исправить?

2. nvm — Это была проблема с капитализацией, работает отлично! Спасибо!