从Xamarin表单中的HtmlWebViewSource控件读取HTML值

时间:2018-11-23 15:25:51

标签: xamarin webview xamarin.forms

我们有一个网络和移动应用程序,可以使用HTML生成动态问卷。这使我们可以创建各种各样的问题(文本框,下拉菜单,日期,单选按钮)。我们目前正在使用 Xamarin Forms 重新构建我们的应用程序,并希望重新使用生成此调查表的现有代码。另外,并非我们需要的所有控件都在 Xamarin 中实现。

到目前为止,我已经使用 WebView Xamarin 中生成了问卷。这很完美。当用户提交问卷时,我可以从 WebView 中检索HTML。问题在于HTML不会显示用户对问题输入的任何答案。例如,如果用户在文本字段之一中键入响应,则在 WebView 控件返回的HTML中找不到该响应。

这是我创建HTML调查表的方式。

StringBuilder htmlString = new StringBuilder();
//build up my HTML string here
htmlString.Append("<div>.....");

var htmlWebView = new HtmlWebViewSource { Html = htmlString.ToString() };
WebView.Source = htmlWebView;

在提交按钮的click事件中,我正在这样从 WebView 控件中检索HTML。

var webViewSource = WebView.Source;
var htmlString = (string) WebViewSource.GetValue(HtmlWebViewSource.HtmlProperty);

我可以从 WebView 上传和检索HTML。但是,如何返回用户的回复?

更新

我可以将非常简单的Javascript函数添加到我的 WebView的 HTML中,如下所示。这只返回100。

private static string GetJavascriptFunction()
{
    StringBuilder htmlString = new StringBuilder();
    htmlString.Append("<html>");
    htmlString.Append("<body>");
    htmlString.Append("<script type=\"text/javascript\">");
    htmlString.Append("function getValue() {");
    htmlString.Append("return 100;");
    htmlString.Append("}");
    htmlString.Append("</script>");
    return htmlString.ToString();
}

按如下所示正确调用该函数将返回100。

string result = await WebView.EvaluateJavaScriptAsync("getValue()");

但是,如果我希望Javascript执行任何形式的DOM操作,它始终只会返回null。

private static string GetJavascriptFunction()
{
    StringBuilder htmlString = new StringBuilder();
    htmlString.Append("<html>");
    htmlString.Append("<body>");
    htmlString.Append("<script type=\"text/javascript\">");
    htmlString.Append("function getValue() {");
    htmlString.Append("return document.body.innerHTML;");
    htmlString.Append("}");
    htmlString.Append("</script>");
    return htmlString.ToString();
}

现在返回null。

是否可以使用Javascript在 WebView 控件中从HTML返回值?

1 个答案:

答案 0 :(得分:0)

在几次失败的尝试之后,我设法使它起作用。这是我为从WebView检索用户的响应而添加的功能。

private async Task<string> GetValueFromTextbox(string controlId)
{
    return await WebView.EvaluateJavaScriptAsync($"document.getElementById('{controlId}').value;");
}
private async Task<string> GetValueFromCheckbox(string controlId)
{
    return await WebView.EvaluateJavaScriptAsync($"document.getElementById('{controlId}').checked;");
}
private async Task<string> GetValueFromRadioButton(string controlname)
{
    return await WebView.EvaluateJavaScriptAsync($"document.querySelector(\'input[name=\"{controlname}\"]:checked\').value;");
}
private async Task<string> GetValueFromDropdownn(string controlId)
{
    return await WebView.EvaluateJavaScriptAsync($"document.getElementById(\'{controlId}\').options[document.getElementById(\'{controlId}\').selectedIndex].text;");
}