#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 — Это была проблема с капитализацией, работает отлично! Спасибо!