我有一个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
签名。
有没有办法做到这一点?
出于记录目的,我实际上是在尝试传递一长串单词以实现自动完成目的,因此它不仅仅是一个简单的“字符串”。
答案 0 :(得分:1)
您的代码中的问题: 您没有正确注册Js对象,这就是为什么您无法在JS中获取对象。
指南:
RegisterJsObject将注册您的c#对象,然后从JS调用这些方法并将值从JS发送到c#。
如果要将空字符串从c#传递到HTML页面,则应按如下所示注册JS对象:
您的c#类应如下所示: 公共类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是正在传递的参数。
希望这会有所帮助。