尝试通过调用从JS向父页面发送post请求
function sendPostMessage(message) {
console.log("sending post");
var post = { conf: message };
parent.postMessage(post, "*");
}
来自 c# 如
private void post_to_parent(string message)
{
Debug.WriteLine($"Sending post: {message}");
ScriptManager.RegisterStartupScript(this, this.GetType(), Guid.NewGuid().ToString(), $"sendPostMessage(\"{message}\");", true);
}
但我没有得到任何回应。
如果我从同一个 JS 调用该函数,一切都会正常。 如果我从 C# 函数调用它,我会在调试控制台中收到消息,但在 JavaScript 控制台中不会收到任何消息。没有消息,什么都没有。
我可以用同样的方式调用其他 JS 函数,而且效果很好。
我使用的是 ASP.NET Web 表单,这将是 IFrame 中的子级向父级发送响应。
这应该可行。
假设我有一个主页,然后嵌入一个 iFrame。
所以,主机页面标记:
<asp:Button ID="cmdToast" runat="server" Text="Server side toast inject"
CssClass="btn"
OnClick="cmdToast_Click"
/>
<h3>Below is iFrame area</h3>
<iframe
src="ToastIFrame.aspx"
>
</iframe>
<script>
function mytoast(sHeading, sMessage) {
$.toast({
heading: sHeading,
text: sMessage,
position: 'mid-center',
icon: 'info',
hideAfter: 5000,
allowToastClose: false,
loader: false,
showHideTransition: 'slide'
});
}
</script>
主页按钮代码是这样的:
protected void Page_Load(object sender, EventArgs e)
{
}
protected void cmdToast_Click(object sender, EventArgs e)
{
string sJava = @"mytoast('Toast Heading','This is a toast message<br/>From main page');";
ScriptManager.RegisterStartupScript(Page, Page.GetType(), "mymsg", sJava, true);
}
在放入 iFrame 的页面中,我们有以下标记:
<asp:Button ID="cmdTest" runat="server" Text="To parent"
OnClick="cmdTest_Click"
/>
<script>
function sendPostMessage(message) {
console.log("sending post");
parent.mytoast('From iFrame', message);
}
</script>
iFrame 中页面的隐藏代码是这样的:
protected void Page_Load(object sender, EventArgs e)
{
}
protected void cmdToast_Click(object sender, EventArgs e)
{
string sJava = @"mytoast('Toast Heading','This is a toast message<br/>From main page');";
ScriptManager.RegisterStartupScript(Page, Page.GetType(), "mymsg", sJava, true);
}
所以,我运行页面时的效果是这样的:
因此主页面和子页面(iFrame 中的页面)都能够注入脚本(RegisterStartUpScript),并且都能够调用父页面中相同的 JavaScript 函数。