Передача строки / JSON из C # в JS с помощью CefSharp - PullRequest
1 голос
/ 31 марта 2019

У меня есть 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 Ответ

1 голос
/ 31 марта 2019

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

Рекомендации:

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

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

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

   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.

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

...