1. 程式人生 > 實用技巧 >Dynamics 365站點地圖中新增動態連結

Dynamics 365站點地圖中新增動態連結

我是微軟Dynamics 365 & Power Platform方面的工程師/顧問羅勇,也是2015年7月到2018年6月連續三年Dynamics CRM/Business Solutions方面的微軟最有價值專家(Microsoft MVP),歡迎關注我的微信公眾號 MSFTDynamics365erLuoYong ,回覆424或者20201010可方便獲取本文,同時可以在第一間得到我釋出的最新博文資訊,follow me!

有時候我們需要在站點地圖中新增連結,如果是靜態連結,比較好辦,比如連結到某個公共網址裁判文書網,網址是 https://wenshu.court.gov.cn/ ,這麼設定下就可以

但是如果這個網址是動態的,比如一個Canvas App 的URL,不同的環境(environment)是不同的,那如何設定呢?如果設定為某個環境的URL,那麼新環境就需要手動更改,每次更改容易忘記,也不方便。這時候可以考慮將這個導航專案設定為某個HTML 型別的Web資源,類似如下。

這種做法可以做到在當前頁面開啟,也就是在導航專案的右邊開啟,如果需要在新視窗中開啟呢?那就需要在程式碼中使用類似 程式碼。這個還有個問題,那麼右邊的顯示區域是空白的,還好顏色是主題的背景色,不算太違和。你會發現,如果導航專案設定的是絕對URL,那麼點選這個導航專案會直接將絕對URL在新Tab中開啟,導航專案不會變化,比如之前開啟的是Case實體,還是保留在Case實體。如何也做到類似的效果呢?沒有特別好的辦法,只有在程式碼中加上類似window.history.back(); 的程式碼就做出來的效果就非常像了。

還有一個問題,我這做的動態連結其實都存放在一個實體中,我需要的只是一個名稱name就可以去獲取了,當設定導航專案是Web資源時候可以傳遞引數過來嗎?答案是可以的。介面上設定似乎效果不好,可以直接編輯站點地圖的URL,我這裡舉個例子。值得注意的是要用 data 這個query string key來傳遞值,傳遞的鍵值對要用JavaScript encodeURIComponent 函式編碼下,比如 = 需要轉換成%3D 。

            <SubArea Id="NewSubArea_1ac8c778" ResourceId="SitemapDesigner.NewSubArea"
Url="$webresource:ly_/page/common/dynamicredirectpage.html?data=name%3DConiguration_Name" Client="All,Outlook,OutlookLaptopClient,OutlookWorkstationClient,Web" AvailableOffline="true" PassParams="false" Sku="All,OnPremise,Live,SPLA"> <Titles> <Title LCID="1033" Title="Dynamics URL Demo" /> </Titles> </SubArea>

下面再給這個HTML Web資源的程式碼示例如下:

<!DOCTYPE html>

<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Lenovo</title>
    <script src="../../../ClientGlobalContext.js.aspx" type="text/javascript"></script>
</head>
<body onload="onLoad()">
    <script type="text/javascript">
        function onLoad() {
            window.history.back();
            var name = "YouKey";
            var queryStrArray = new Array();
            var vals = new Array();
            if (location.search !== "") {
                queryStrArray = location.search.substr(1).split("&");
                for (var i in queryStrArray) {
                    queryStrArray[i] = queryStrArray[i].replace(/\+/g, " ").split("=");
                }
                for (var i in queryStrArray) {
                    if (queryStrArray[i][0].toLowerCase() === "data") {
                        vals = decodeURIComponent(queryStrArray[i][1]).split("&");
                        for (var i in vals) {
                            vals[i] = vals[i].replace(/\+/g, " ").split("=");
                            if (vals[i][0].toLowerCase() === "name") {
                                name = vals[i][1];
                            }
                        }
                        break;
                    }
                }
            }
            if (typeof GetGlobalContext !== "undefined") {
                var clientUrl = GetGlobalContext().getClientUrl() + "/api/data/v9.1/";
                var req = new XMLHttpRequest();
                req.open("GET", encodeURI(clientUrl + "ly_configs?$select=ly_url&$filter=ly_name eq '" + name + "' and statecode eq 0&$top=1"), false);
                req.setRequestHeader("Accept", "application/json");
                req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
                req.setRequestHeader("OData-MaxVersion", "4.0");
                req.setRequestHeader("OData-Version", "4.0");
                req.onreadystatechange = function () {
                    if (this.readyState === 4 /* complete */) {
                        req.onreadystatechange = null;
                        if (this.status === 200) {
                            var responseJson = JSON.parse(this.responseText);
                            if (responseJson.value.length >= 1) {
                                window.open(responseJson.value[0].ly_url);
                            }
                        }
                        else {
                            throw new Error("Query data error:" + JSON.parse(this.responseText));
                        }
                    }
                };
                req.send();
            } else {
                throw new Error("Reference to ClientGlobalContext.js.aspx error.");
            }
        }
    </script>
</body>
</html>