Lors de l'interopérabilité de Silverlight avec JavaScript, j'ai rencontré un comportement étrange dans mon application Silverlight Out-of-Browser (OOB). Mon but est de publier des données http sur le site spécifique. Nous pouvons publier des données en utilisant des classes WebClient ou HTTPWebRequest. Mais alors comment rediriger la réponse à un navigateur Web externe? Je pensais générer un formulaire HTML dynamique avec post-méthode et invoquer une fonction JavaScript de Silverlight qui enverrait le formulaire. Malheureusement, il ne soumet le formulaire qu'avec target = "_ self" et non avec target = "_ blank". code pour le chargement généré chaîne HTML dans le contrôle WebBrowser de Silverlight:Paramètres Http-post et réponse d'affichage dans un navigateur utilisant Silverlight et JavaScript
WebBrowser wb = parameter as WebBrowser;
if (wb == null)
return;
wb.NavigateToString(GetHtml());
méthode de test simple pour générer HTML:
private string GetHtml()
{
StringBuilder sb = new StringBuilder();
sb.Append ("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">");
sb.Append ("<html xmlns=\"http://www.w3.org/1999/xhtml\">");
sb.Append ("<head><title></title>");
sb.Append(
"<script type=\"text/javascript\">function submitForm(){" +
"document.forms[0].submit(); window.external.notify(\"Form Submitted!\");}</script>");
sb.Append("</head>");
sb.Append ("<body>");
sb.Append ("<form id=\"mainForm\" name=\"formName1\" action=\"http://localhost:53222/ReceivePost.aspx\" method=\"POST\" target=\"_blank\">");
sb.Append ("<input type=\"text\" name=\"u\" value=\"username\"/>");
sb.Append ("<input type=\"password\" name=\"p\" value=\"password\"/>");
sb.Append ("<input type=\"submit\" value=\"Submit\"/>");
sb.Append("</form>");
sb.Append("</body></html>");
return sb.ToString();
}
qui génère cette page HTML:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<script type="text/javascript">
function submitForm(){
document.forms[0].submit();
window.external.notify("Form Submitted!");
}
</script>
</head>
<body>
<form id="mainForm" name="formName1" action="http://localhost:53222/ReceivePost.aspx" method="POST" target="_blank">
<input type="text" name="u" value="username"/>
<input type="password" name="p" value="password"/>
<input type="submit" value="Submit"/>
</form>
</body>
</html>
Et le code invoquant la fonction JS:
innerWebBrowser.ScriptNotify += (o, args) =>
{
MessageBox.Show("JS says: " + args.Value);
};
innerWebBrowser.InvokeScript ("submitForm");
Comme je l'ai dit, ce code fonctionne très bien avec la cible définie sur "_self" mais ne fonctionne pas avec la cible définie sur "_blank". Même si j'appuie sur le bouton Soumettre avec une souris, les données de publication ne sont pas envoyées, juste le site Web est rendu dans un navigateur externe sans données de publication. Est-ce dû au mécanisme de sécurité de Silverlight? Je devrais également mentionner que je poste sur le même site où l'application Silverlight est publiée: http://localhost:53222
(bien qu'il ne soit pas encore publié car je l'exécute directement depuis VisualStudio en mode OOB). Donc il ne devrait pas être classé comme script inter-site je suppose ...
Y at-il un moyen de publier des données sur un site Web (pas nécessairement du même domaine) et de rediriger la réponse à un navigateur externe?
De toute façon, vos commentaires sont les bienvenus.