在Iframe c#中显示Power BI的磁贴
本文关键字:BI Power 显示 Iframe | 更新日期: 2023-09-27 18:26:35
我想知道是否有人能帮我,我正在尝试将power bi的tile嵌入到I-frame中。我尝试了很多方法,但最终似乎一无所获,或者只是装载标志"不停"。下面的代码我什么也没看到。还有没有一种方法可以在不使用java脚本的情况下做到这一点。?
<script type="text/javascript">
var width = 800;
var height = 600;
var embedTileUrl = @Model.Tile.embedUrl;
var accessToken = @Model.AccessToken;
window.onload = function () {
updateEmbedTile();
};
function updateEmbedTile() {
if ("" === embedTileUrl)
return;
iframe = document.getElementById('iFrameEmbedTile');
iframe.src = embedTileUrl + "&width=" + width + "&height=" + height;
iframe.onload = postActionLoadTile;
}
function postActionLoadTile() {
if ("" === accessToken)
return;
var h = height;
var w = width;
var m = { action: "loadTile", accessToken: accessToken, height: h, width: w };
message = JSON.stringify(m);
iframe = document.getElementById('iFrameEmbedTile');
iframe.contentWindow.postMessage(message, "*");
}
</script>
<iframe id="iFrameEmbedTile" src="" height="500px" width="500px" frameborder="0" seamless></iframe>
power-bi-tile嵌入api要求您加载嵌入页面并传递参数,如我在前面的评论中引用的示例所示。你可以在浏览器中使用javascript来做到这一点,但我至少见过一个例子,有人在安卓应用程序中这样做,而web浏览器控件中只托管了tile。类似地,应该可以在windows通用应用程序中使用web视图,使用navigation方法直接加载ifame url,使用scriptnotify获得加载的tile页面的通知,然后使用invokescriptasync传递postmessage。如果这不能直接起作用,那么您可以使用navigationstring在将post消息传递给iframe的页面上放置一个.js方法。我自己还没有机会玩这个。如果你能让它发挥作用,我很想看看你的工作要点。
https://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.webview
这些更改最终修复了它,作为一个快速修复,但我打算进一步研究这一点,并找到一个不使用Javascript的更好解决方案。
修复了第一个问题:
var accessTokenElement = "@Model.AccessToken";
修复了第二个问题:
<input type="text" id="tb_EmbedURL" value="@Model.Tile.embedUrl" hidden />
<input type="button" id="bEmbedTileAction" value="Embed Tile" hidden />
<iframe id="iFrameEmbedTile" src="" height="450" width="450" frameborder="0" align="middle" seamless></iframe>
这将自动加载。以下是代码的总体
<script type="text/javascript">
window.onload = function () {
var el = document.getElementById("bEmbedTileAction");
if (el.addEventListener) {
el.addEventListener("click", updateEmbedTile, false);
} else {
el.attachEvent('onclick', updateEmbedTile);
}
if (window.addEventListener) {
window.addEventListener("message", receiveMessage, false);
} else {
window.attachEvent("onmessage", receiveMessage);
}
var accessTokenElement = "@Model.AccessToken";
if (null !== accessTokenElement) {
var accessToken = accessTokenElement.value;
if ("" !== accessToken)
updateEmbedTile();
}
};
var width = 450;
var height = 450;
function receiveMessage(event) {
if (event.data) {
try {
messageData = JSON.parse(event.data);
if (messageData.event === "tileClicked") {
//Get IFrame source and construct dashboard url
iFrameSrc = document.getElementById(event.srcElement.iframe.id).src;
//Split IFrame source to get dashboard id
var dashboardId = iFrameSrc.split("dashboardId=")[1].split("&")[0];
urlVal = iFrameSrc.split("/embed")[0] + "/dashboards/{0}";
urlVal = urlVal.replace("{0}", dashboardId);
window.open(urlVal);
}
}
catch (e) {
// In a production app, handle exception
}
}
}
function updateEmbedTile() {
// check if the embed url was selected
var embedTileUrl = document.getElementById('tb_EmbedURL').value;
if ("" === embedTileUrl)
return;
iframe = document.getElementById('iFrameEmbedTile');
iframe.src = embedTileUrl + "&width=" + width + "&height=" + height;
iframe.onload = postActionLoadTile;
}
function postActionLoadTile() {
accessToken = "@Model.AccessToken";
if ("" === accessToken)
return;
var h = height;
var w = width;
var m = { action: "loadTile", accessToken: accessToken, height: h, width: w };
message = JSON.stringify(m);
iframe = document.getElementById('iFrameEmbedTile');
iframe.contentWindow.postMessage(message, "*");;
}
</script>
<input type="text" id="tb_EmbedURL" value="@Model.Tile.embedUrl" hidden />
<input type="button" id="bEmbedTileAction" value="Embed Tile" hidden />
<iframe id="iFrameEmbedTile" src="" height="450" width="450" frameborder="0" align="middle" seamless></iframe>