使用 CefSharp 将 string/JSON 从 C# 传递到 JS
Passing string/JSON from C# to JS using CefSharp
我有一个 html 页面,我想将其托管在我的 C# 应用程序 (WPF) 中。
因为我需要浏览器基于 Chromium,所以我使用的是 cefSharp。
我想将字符串数据从 C# 传递到 JS 以进行页面初始化。
我发现 RegisterJsObject
让我可以从 JS 访问 C# 对象,但我似乎无法从它传递任何字符串信息。
我的代码目前看起来像这样:
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
签名。
有办法吗?
郑重声明,我实际上是在尝试传递一长串用于自动完成的单词,所以它不会只是一个简单的 'string'。
你的代码有问题:
您没有正确注册 Js 对象,这就是您无法在 JS 中获取对象的原因。
准则:
RegisterJsObject 是注册你的c#对象,然后从JS调用这些方法并将值从JS发送到c#。
如果你想将空字符串从 c# 传递到你的 HTML 页面,那么你应该像下面这样注册 JS 对象:
你的c#class应该如下所示:
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 实例中注册这个 class 如下所示:
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是正在传递的参数。
希望对您有所帮助。
我有一个 html 页面,我想将其托管在我的 C# 应用程序 (WPF) 中。 因为我需要浏览器基于 Chromium,所以我使用的是 cefSharp。
我想将字符串数据从 C# 传递到 JS 以进行页面初始化。
我发现 RegisterJsObject
让我可以从 JS 访问 C# 对象,但我似乎无法从它传递任何字符串信息。
我的代码目前看起来像这样:
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
签名。
有办法吗?
郑重声明,我实际上是在尝试传递一长串用于自动完成的单词,所以它不会只是一个简单的 'string'。
你的代码有问题: 您没有正确注册 Js 对象,这就是您无法在 JS 中获取对象的原因。
准则:
RegisterJsObject 是注册你的c#对象,然后从JS调用这些方法并将值从JS发送到c#。
如果你想将空字符串从 c# 传递到你的 HTML 页面,那么你应该像下面这样注册 JS 对象:
你的c#class应该如下所示:
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 实例中注册这个 class 如下所示:
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是正在传递的参数。
希望对您有所帮助。