我正在创建一个包含WebBrowser用户控件的winforms应用程序。 WebBrowser控件导航到Web应用程序中的页面,该页面请求用户身份验证详细信息。输入用户名和密码并提交表单后,Web应用程序将发送请求,如果验证成功,则填充applicationValues对象中的变量。
当实例化applicationValues对象时,我想将WebBrowser控件中Web应用程序中的对象读回Winforms应用程序并关闭包含WebBrowser控件的表单。
目前,这是有效的(该对象在Web应用程序中成功创建),直到applicationValues对象应该传递回Winforms应用程序的部分;我被卡住了。
这可以通过此控件完成吗?如果没有,我还应该考虑其他任何方法或解决方法吗?
答案 0 :(得分:1)
可以做到,但需要你做一些工作。首先,在Web浏览器控件和其中的任何页面之间来回传递数据的最简单方法是通过window.external和invoke脚本。当然,您必须在用户控件中设置objectforscripting属性。
完成后,您可以通过原始类型自由地将数据从javacript发送到.net。现在特别针对您的对象,可能值得花时间将其序列化为JSON字符串,然后通过window.external发送,然后反序列化为.NET端的对应对象。你可以使用System.Web.Script.Serialization' s JavaScriptSerializer当然你也可以使用JSON.net到deserialize。
以下是MSDN
的基本概念private void Form1_Load(object sender, EventArgs e)
{
webBrowser1.ObjectForScripting = this;
webBrowser1.DocumentText =
"<html><head><script>" +
"function test(message) { alert(message); }" +
"</script></head><body><button " +
"onclick=\"window.external.Test('called from script code')\">" +
"call client code from script code</button>" +
"</body></html>";
}
public void Test(String message)
{
MessageBox.Show(message, "client code");
}
private void button1_Click(object sender, EventArgs e)
{
webBrowser1.Document.InvokeScript("test",
new String[] { "called from client code" });
}