Dynamic 工具类

前端

PostbirdAlertBox = {
    //=====================弹窗提示========================
    /*
     *  context:弹窗内容
     *  通过全局对象 PostbirdAlertBox 调用相关方法,三个方法为: 
     *  PostbirdAlertBox.alert({}); 提示弹窗
     *  PostbirdAlertBox.confirm({}); 确定弹窗
     *  PostbirdAlertBox.prompt({});输入弹窗
     */
    containerClass: 'postbird-box-container active',
    box: null, // 用于标识增加的div
    textTemplate: {
        title: '提示信息',
        content: '提示内容',
        okBtn: '确认',
        cancelBtn: '取消',
        contentColor: '#000000',
        okBtnColor: '#0e90d2',
        promptTitle: '请输入内容',
        promptOkBtn: "确认"
    },
    //绘制弹窗界面
    getAlertTemplate: function () {
        /* 
          PostbirdAlertBox.alert({
          'title': '提示标题',
          'content': '提示内容主体',
          'okBtn': '确认按钮',
          'contentColor': 'red(提示内容颜色)',
          'onConfirm': function () {//点击确认按钮执行回调方法
          console.log("回调触发后隐藏提示框");
          alert("回调触发后隐藏提示框");
         }
         */
        var temp =
            '<div class="postbird-box-dialog">' +
            '<div class="postbird-box-content">' +
            '<div class="postbird-box-header">' +
            '<span class="postbird-box-close-btn">×</span>' +
            '<span class="postbird-box-title">' +
            '<span >' + this.textTemplate.title + '</span>' +
            '</span>' +
            '</div>' +
            '<div class="postbird-box-text">' +
            '<span style="color:' + this.textTemplate.contentColor + ';">' + this.textTemplate.content + '</span>' +
            '</div>' +
            '<div class="postbird-box-footer">' +
            '<button class="btn-footer btn-block-footer btn-footer-ok" style="color:' + this.textTemplate.okBtnColor + ';">' + this.textTemplate.okBtn + '</button>' +
            '</div>' +
            '</div>' +
            '</div>';
        return temp;
    },
    getConfirmTemplate: function () {
        /*
        PostbirdAlertBox.confirm({
        'title': '提示标题',
        'content': '离开本页面进行跳转',
        'okBtn': '好的',
        'contentColor': 'red',
        'onConfirm': function () {
            alert("点击确认按钮触发事件");
        },
        'onCancel': function () {
            alert("点击取消按钮触发事件");
        }
    });
        }
        */
        return '<div class="postbird-box-container">' +
            '<div class="postbird-box-dialog">' +
            '<div class="postbird-box-content">' +
            '<div class="postbird-box-header">' +
            '<span class="postbird-box-close-btn">×</span>' +
            '<span class="postbird-box-title">' +
            '<span >' + this.textTemplate.title + '</span>' +
            '</span>' +
            '</div>' +
            '<div class="postbird-box-text">' +
            '<span style="color:' + this.textTemplate.contentColor + ';">' + this.textTemplate.content + '?</span>' +
            '</div>' +
            '<div class="postbird-box-footer">' +
            '<button class="btn-footer btn-left-footer btn-footer-cancel" style="color:' + this.textTemplate.cancelBtnColor + ';">' + this.textTemplate.cancelBtn + '</button>' +
            '<button class="btn-footer btn-right-footer btn-footer-ok"  style="color:' + this.textTemplate.okBtnColor + ';">' + this.textTemplate.okBtn + '</button>' +
            '</div>' +
            '</div>' +
            '</div>' +
            '</div>';
    },
    getPromptTemplate: function () {
        /*
         PostbirdAlertBox.prompt({
         'title': '请输入姓名',
         'okBtn': '提交',
         onConfirm: function (data) {
         console.log("输入框内容是:" + data);
         alert("点击确认按钮触发事件");
             },
         onCancel: function (data) {
         console.log("输入框内容是:" + data);
         alert("点击取消按钮触发事件");
         },
         });
         */
        return '<div class="postbird-box-container">' +
            '<div class="postbird-box-dialog">' +
            '<div class="postbird-box-content">' +
            '<div class="postbird-box-header">' +
            '<span class="postbird-box-close-btn">×</span>' +
            '<span class="postbird-box-title">' +
            '<span >' + this.textTemplate.title + '</span>' +
            '</span>' +
            '</div>' +
            '<div class="postbird-box-text">' +
            '<input type="text" class="postbird-prompt-input" autofocus="true" >' +
            '</div>' +
            '<div class="postbird-box-footer">' +
            '<button class="btn-footer btn-left-footer btn-footer-cancel" style="color:' + this.textTemplate.cancelBtnColor + ';">' + this.textTemplate.cancelBtn + '</button>' +
            '<button class="btn-footer btn-right-footer btn-footer-ok"  style="color:' + this.textTemplate.okBtnColor + ';">' + this.textTemplate.okBtn + '</button>' +
            '</div>' +
            '</div>' +
            '</div>' +
            '</div>';
    },
    //执行回调方法
    alert: function (opt) {
        this.textTemplate.title = opt.title || this.textTemplate.title;
        this.textTemplate.content = opt.content || this.textTemplate.content;
        this.textTemplate.okBtn = opt.okBtn || this.textTemplate.okBtn;
        this.textTemplate.okBtnColor = opt.okBtnColor || this.textTemplate.okBtnColor;
        this.textTemplate.contentColor = opt.contentColor || this.textTemplate.contentColor;
        var box = document.createElement("div"),
            _this = this;
        box.className = this.containerClass;
        box.innerHTML = this.getAlertTemplate();
        this.box = box;
        document.body.appendChild(this.box);
        var btn = document.getElementsByClassName('btn-footer-ok');
        btn[btn.length - 1].focus();
        btn[btn.length - 1].onclick = function () {
            if (opt.onConfirm) {
                opt.onConfirm();
            }
            _this.removeBox();
        }
    },
    confirm: function (opt) {
        this.textTemplate.title = opt.title || this.textTemplate.promptTitle;
        this.textTemplate.promptPlaceholder = opt.promptPlaceholder || this.textTemplate.promptPlaceholder;
        this.textTemplate.okBtn = opt.okBtn || this.textTemplate.promptOkBtn;
        this.textTemplate.okBtnColor = opt.okBtnColor || this.textTemplate.okBtnColor;
        this.textTemplate.cancelBtn = opt.cancelBtn || this.textTemplate.cancelBtn;
        this.textTemplate.cancelBtnColor = opt.cancelBtnColor || this.textTemplate.cancelBtnColor;
        this.textTemplate.content = opt.content || this.textTemplate.content;
        var box = document.createElement("div"),
            _this = this;
        this.box = box;
        box.className = this.containerClass;
        box.innerHTML = this.getConfirmTemplate();
        document.body.appendChild(box);
        var okBtn = document.getElementsByClassName('btn-footer-ok');
        okBtn[okBtn.length - 1].focus();
        okBtn[okBtn.length - 1].onclick = function () {
            if (opt.onConfirm) {
                opt.onConfirm();
            }
            _this.removeBox();
        }
        var cancelBtn = document.getElementsByClassName('btn-footer-cancel');
        cancelBtn[cancelBtn.length - 1].onclick = function () {
            if (opt.onCancel) {
                opt.onCancel();
            }
            _this.removeBox();
        }
    },
    prompt: function (opt) {
        this.textTemplate.title = opt.title || this.textTemplate.title;
        this.textTemplate.content = opt.content || this.textTemplate.content;
        this.textTemplate.contentColor = opt.contentColor || this.textTemplate.contentColor;
        this.textTemplate.okBtn = opt.okBtn || this.textTemplate.okBtn;
        this.textTemplate.okBtnColor = opt.okBtnColor || this.textTemplate.okBtnColor;
        this.textTemplate.cancelBtn = opt.cancelBtn || this.textTemplate.cancelBtn;
        this.textTemplate.cancelBtnColor = opt.cancelBtnColor || this.textTemplate.cancelBtnColor;
        var box = document.createElement("div"),
            _this = this;
        box.className = this.containerClass;
        box.innerHTML = this.getPromptTemplate();
        this.box = box;
        document.body.appendChild(box);
        var promptInput = document.getElementsByClassName('postbird-prompt-input');
        promptInput = promptInput[promptInput.length - 1];
        promptInput.focus();
        var okBtn = document.getElementsByClassName('btn-footer-ok');
        var inputData = promptInput.value;;
        okBtn[okBtn.length - 1].onclick = function () {
            if (opt.onConfirm) {
                opt.onConfirm(promptInput.value);
            }
            _this.removeBox();
        }
        var cancelBtn = document.getElementsByClassName('btn-footer-cancel');
        cancelBtn[cancelBtn.length - 1].onclick = function () {
            if (opt.onCancel) {
                opt.onCancel(promptInput.value);
            }
            _this.removeBox();
        }
    },
    //关闭弹窗
    colse: function () {
        this.removeBox();
    },
    removeBox: function () {
        var box = document.getElementsByClassName(this.containerClass);
        document.body.removeChild(box[box.length - 1]);
    }
}
DynamicHelper={
//=================显示请求加载动画====================
 ShowLoading:function(context) {
    //context:加载提示内容
    //加载的图片路径可替换
    var tit = context || "加载中,请稍候…";
    var loadingHtml =
        "<div style=' 100%; height: 100%; position: fixed; z-index: 9999999; left: 0px; top: 0px; background: rgba(255,255,255,0.2);'><div style='position: absolute;left:50%;top:50%;transform: translate(-50%, -50%);background:white; text-align:center;'><img src='/_imgs/AdvFind/progress.gif' style='40px;height:40px;' /><br/><span style='margin-top:5px;'>" +
        tit + "</span></div></div>";
    var loadingElement = document.createElement('div');
    loadingElement.id = "myloading";
    loadingElement.innerHTML = loadingHtml;
    window.parent.parent.document.body.appendChild(loadingElement);
},
//=================加载请求动画关闭====================
 CloseLoading:function() {
    var element = window.parent.parent.document.getElementById("myloading");
    window.parent.parent.document.body.removeChild(element);
},
//=================FetchXml数据查询====================
GetEntityDatas:function(url, fetchxml) {
    //url:请求地址,fetchxml:fetchXml语句
    var req = new XMLHttpRequest();
    var list = [];
    var erro = "";
    req.open("GET", encodeURI(url + encodeURI(fetchxml), true), 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) {
            req.onreadystatechange = null;
            if (this.status == 200) {
                if (JSON.parse(this.response).value.length > 0)
                    list = JSON.parse(this.response).value;
            } else {
                erro = JSON.parse(this.response).error;
            }
        }
    };
    req.send();
    if (erro != "") {
        return erro;
    } else {
        return list;
    }
},
//===================冒泡顺序排序======================
Order:function(arr) {
    //arr:冒泡数据集合
    // 遍历数组,次数就是arr.length - 1
    if (arr.length > 1) {
        for (var j = 0; j < arr.length - 1; j++) {
            for (var i = 0; i < arr.length - 1; i++) {
                var num_1 = arr[i];
                var num_2 = arr[i + 1];
                if (num_1 > num_2) {
                    var temp = arr[i];
                    arr[i] = arr[i + 1];
                    arr[i + 1] = temp;
                }
            }
        }
    }
    return arr;
},
//===================冒泡倒序排序======================
FlashbacksSort:function(arr) {
    //arr:冒泡数据集合
    // 遍历数组,次数就是arr.length - 1
    if (arr.length > 1) {
        for (var j = 0; j < arr.length - 1; j++) {
            for (var i = 0; i < arr.length - 1; i++) {
                var num_1 = arr[i];
                var num_2 = arr[i + 1];
                if (num_1 < num_2) {
                    var temp = arr[i];
                    arr[i] = arr[i + 1];
                    arr[i + 1] = temp;
                }
            }
        }
    }
    return arr;
    },
//==================金额小写转大写=====================
changeNumMoneyToChinese:function(money) {
    //money:十进制数据
    var cnNums = new Array("零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"); //汉字的数字
    var cnIntRadice = new Array("", "拾", "佰", "仟"); //基本单位
    var cnIntUnits = new Array("", "万", "亿", "兆"); //对应整数部分扩展单位
    var cnDecUnits = new Array("角", "分", "毫", "厘"); //对应小数部分单位
    var cnInteger = "整"; //整数金额时后面跟的字符
    var cnIntLast = "元"; //整型完以后的单位
    var maxNum = 999999999999999.9999; //最大处理的数字
    var IntegerNum; //金额整数部分
    var DecimalNum; //金额小数部分
    var ChineseStr = ""; //输出的中文金额字符串
    var parts; //分离金额后用的数组,预定义
    var Symbol = "";//正负值标记
    if (money == "") {
        return "";
    }

    money = parseFloat(money);
    if (money >= maxNum) {
        alert('超出最大处理数字');
        return "";
    }
    if (money == 0) {
        ChineseStr = cnNums[0] + cnIntLast + cnInteger;
        return ChineseStr;
    }
    if (money < 0) {
        money = -money;
        Symbol = "负 ";
    }
    money = money.toString(); //转换为字符串
    if (money.indexOf(".") == -1) {
        IntegerNum = money;
        DecimalNum = '';
    } else {
        parts = money.split(".");
        IntegerNum = parts[0];
        DecimalNum = parts[1].substr(0, 4);
    }
    if (parseInt(IntegerNum, 10) > 0) { //获取整型部分转换
        var zeroCount = 0;
        var IntLen = IntegerNum.length;
        for (var i = 0; i < IntLen; i++) {
            var n = IntegerNum.substr(i, 1);
            var p = IntLen - i - 1;
            var q = p / 4;
            var m = p % 4;
            if (n == "0") {
                zeroCount++;
            }
            else {
                if (zeroCount > 0) {
                    ChineseStr += cnNums[0];
                }
                zeroCount = 0; //归零
                ChineseStr += cnNums[parseInt(n)] + cnIntRadice[m];
            }
            if (m == 0 && zeroCount < 4) {
                ChineseStr += cnIntUnits[q];
            }
        }
        ChineseStr += cnIntLast;
        //整型部分处理完毕
    }
    if (DecimalNum != '') { //小数部分
        var decLen = DecimalNum.length;
        for (var i = 0; i < decLen; i++) {
            var n = DecimalNum.substr(i, 1);
            if (n != '0') {
                ChineseStr += cnNums[Number(n)] + cnDecUnits[i];
            }
        }
    }
    if (ChineseStr == '') {
        ChineseStr += cnNums[0] + cnIntLast + cnInteger;
    } else if (DecimalNum == '') {
        ChineseStr += cnInteger;
    }
    ChineseStr = Symbol + ChineseStr;
    return ChineseStr;
},
//========判断当前操作人员的安全角色是否符合===========
CallerPermissionsIsAre:function(list) {
    //list:安全角色名称集合
    //获取当前操作者权限id集合
    var RoleId = Xrm.Page.context.getUserRoles();//获取当前的权限id
    var bool = false;
    for (var i = 0; i < RoleId.length; i++) {
        //之所以用for是因为当前的用户可能不止一个角色,我们需要将他遍历出来。
        var req = new XMLHttpRequest();
        req.open("GET", "/api/data/v9.0/roles(" + RoleId[i] + ")?$select=name", false);//true是异步,false是同步
        req.setRequestHeader("OData-MaxVersion", "4.0");
        req.setRequestHeader("OData-Version", "4.0");
        req.setRequestHeader("Accept", "application/json");
        req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
        req.setRequestHeader("Prefer", "odata.include-annotations="*"");
        req.onreadystatechange = function () {
            if (this.readyState === 4) {
                req.onreadystatechange = null;
                if (this.status === 200) {//200执行成功且有返回值
                    var result = JSON.parse(this.response);
                    var name = result["name"];
                    if (list.indexOf(name) != -1) {
                        bool = true;
                    }

                } else {
                    var error = JSON.parse(this.response).error;
                    Xrm.Utility.alertDialog(this.statusText + error.message + "错误");
                }
            }
        };
        req.send();
    }
    return bool;
},
//============获取指定用户的安全角色名称===============
GetUserRolesName:function (UserID) {
    //UserID:用户的Guid,带{}
    var ServerUrl = Xrm.Page.context.getClientUrl();
    if (ServerUrl.match(//$/)) {
        ServerUrl = ServerUrl.substring(0, ServerUrl.length - 1);
    }
    var retrieveReq = new XMLHttpRequest();
    retrieveReq.open("GET", ServerUrl + "/XRMServices/2011/OrganizationData.svc/SystemUserSet?$select=systemuserroles_association/Name&$expand=systemuserroles_association&$filter=SystemUserId eq guid'" + UserID + "'", false);
    retrieveReq.setRequestHeader("Accept", "application/json");
    retrieveReq.setRequestHeader("Content-Type", "application/json;charset=utf-8");
    retrieveReq.send();
    var ODataResult = JSON.parse(retrieveReq.responseText).d;
    var rolesNameList = [];
    if (ODataResult != null && ODataResult.results.length == 1 && ODataResult.results[0].systemuserroles_association.results.length > 0) {
        var oDataRoles = ODataResult.results[0].systemuserroles_association.results;
        for (var i = 0; i < oDataRoles.length; i++) {
            rolesNameList.push(oDataRoles[i]["Name"]);
        }
    }
    return rolesNameList;
},
//==================实体字段赋值=======================
FileldsSetValue:function(list, obj) {
    //list:实体字段集合,obj需要赋值的信息
    //循环添加信息,查找类型不予添加
    for (var key in list) {
        var filedName = list[key];
        //验证字段是否存在
        if (Xrm.Page.getAttribute(list[key]) == null) {
            return list[key] + ":字段不存在!";
        }
        //判断当前字段类型
        var type = Xrm.Page.getControl(filedName).getControlType();
        switch (type) {
            case "standard"://文本格式,日期格式,十进制格式,两个选项
                var DateType = new Date(Xrm.Page.getAttribute(filedName).getValue());
                if (DateType == "Invalid Date") {
                    //文本格式
                    Xrm.Page.getAttribute(filedName).setValue(obj[filedName]);
                }
                else {
                    //日期
                    Xrm.Page.getAttribute(filedName).setValue(new Date(obj[filedName]));
                }
                break;
            case "multiselectoptionset"://多选选项集
                //获取选项集值
                var multi_select_value = obj[filedName].split(',');
                //将文本类型的信息转化为数字类型进行数据赋值
                var multiSelectList = [];
                for (var i in multi_select_value) {
                    multiSelectList.push(multi_select_value[i]);
                }
                //信息赋值
                Xrm.Page.getAttribute(filedName).setValue(multiSelectList);
                break;
            case "optionset"://单选选项集
                Xrm.Page.getAttribute(filedName).setValue(obj[filedName]);
                break;
            default:
        }
    }
},
//================实体字段隐藏显示=====================
FileldsSetVisible:function(list, isHiddon) {
    //list:字段集合,isHiddon:是否隐藏 true隐藏 false显示
    //判断是隐藏还是显示
    if (isHiddon) {
        //隐藏
        for (var i in list) {
            //验证字段是否存在
            if (Xrm.Page.getAttribute(list[i]) == null) {
                return list[i] + ":字段不存在!";
            }
            //隐藏字段
            Xrm.Page.getControl(list[i]).setVisible(false)
        }
    } else {
        //显示
        for (var i in list) {
            //验证字段是否存在
            if (Xrm.Page.getAttribute(list[i]) == null) {
                return list[i] + ":字段不存在!";
            }
            //显示字段
            Xrm.Page.getControl(list[i]).setVisible(true)
        }
    }
},
//===============-实体字段是否必填=====================
FileldsSetRequiredLevel:function(list, isRequired) {
    //list:字段集合,isRequired:是否必填 true必填 false非必填
    //判断是隐藏还是显示
    if (isRequired) {
        //必填
        for (var i in list) {
            //验证字段是否存在
            if (Xrm.Page.getAttribute(list[i]) == null) {
                return list[i] + ":字段不存在!";
            }
            //字段必填
            Xrm.Page.getAttribute(list[i]).setRequiredLevel('required');
        }
    } else {
        //非必填
        for (var i in list) {
            //验证字段是否存在
            if (Xrm.Page.getAttribute(list[i]) == null) {
                return list[i] + ":字段不存在!";
            }
            //字段非必填
            Xrm.Page.getAttribute(list[i]).setRequiredLevel('none');
        }
    }
},
//================实体字段是否锁定=====================
FileldsSetDisabled:function(list, isLock) {
    //list:字段集合,isLock:是否锁定 true锁定 false非锁定
    //判断是隐藏还是显示
    if (isLock) {
        //锁定
        for (var i in list) {
            //验证字段是否存在
            if (Xrm.Page.getAttribute(list[i]) == null) {
                return list[i] + ":字段不存在!";
            }
            //字段锁定
            Xrm.Page.getControl(list[i]).setDisabled(true)
        }
    } else {
        //非锁定
        for (var i in list) {
            //验证字段是否存在
            if (Xrm.Page.getAttribute(list[i]) == null) {
                return list[i] + ":字段不存在!";
            }
            //字段非锁定
            Xrm.Page.getControl(list[i]).setDisabled(false)
        }
    }
},
//=============子网格数据自定义筛选显示================
SubGridScreening:function (SubGridName, fetchXml) {
    //SubGridName:子网格名称;fetchXml:筛选的fetchXml语句
    if (Xrm.Page.data.entity.getId()) {
        Xrm.Page.getControl(SubGridName).addOnLoad(function (){
            //SubGridName:子网格名称;fetchXml:筛选的fetchXml语句 
            var grid = window.parent.document.getElementById(SubGridName).control;
            if (grid.SetParameter) {
                grid.SetParameter("fetchXml", fetchXml);
                grid.Refresh();
            }
            else grid.get_innerControl().setParameter("fetchXml", fetchXML);
        });
    }
},
//======子网格增删改信息对应主窗体个别字段信息刷新=====
SubGridloadRefreshPage: function (list,fetchXml,SubGridName) {
    //list:需要刷新页面字段集合,fetchXml:主窗体信息,SubGridName:子网格名称
    //防止在未保存数据情况下进行操作
    if (Xrm.Page.data.entity.getId()) {
        Xrm.Page.getControl(SubGridName).addOnLoad(function () {
            //获取当前实体复数形式
            var entityName = Xrm.Page.data.entity.getEntitySetName();
            var list = GetEntityDatas("/api/data/v9.0/" + entityName + "?fetchXml=", fetchXml);
            var obj = list[0];
            //刷新页面数据
            DynamicHelper.FileldsSetValue(list, obj);
            Xrm.Page.data.save();
        });
    }
},
//==============判断当前字段是否被修改================= 
IsFileldsGetIsDirty: function (filelsdName) {
    //fileldName:字段名称集合
    var list = [];//将修改字段信息放入集合之中
    for (var i in filelsdName) {
        //默认该字段是未修改状态
        var bool = false;
        //验证字段是否存在
        if (Xrm.Page.getAttribute(filelsdName[i]) == null) {
            return filelsdName[i] + ":字段不存在!";
        }
        //判断字段是否被修改(ture值被修改,false值未被修改)
        bool = Xrm.Page.getAttribute(filelsdName[i]).getIsDirty();
        //当值被修改,将修改字段添加值list集合中
        if (bool == true) list.push(filelsdName[i]);
    }
    //返回被修改字段信息
    return list;
    },
//===============去除文本数据左右空格==================
ClearTrim: function (Value) {
     //value:string类型数据
     return Value.replace(/(^s*)|(s*$)/g, "");
    },
//=========比较不同信息字段数据是否信息一致============
FieldInfoComparison: function (list, obj) {
//list:字段信息,obj:比较信息
if (obj) {
    for (var key in list) {
        var filedName = list[key];
        //验证字段是否存在
        if (!Xrm.Page.getAttribute(list[key])) {
            return list[key] + ":字段不存在!";
        }
        //当前数据字段
        var targetFieldKey = list[key];
        //上一次数据
        var sourceVal = data[targetFieldKey];
        if (!sourceVal) {
            sourceVal = null;
        }
        //当前数据
        var targetVal = Xrm.Page.getAttribute(targetFieldKey).getValue();
        //判断当前字段类型
        var type = Xrm.Page.getControl(filedName).getControlType();
        switch (type) {
            case "standard"://文本格式,日期格式,十进制格式,两个选项
                var DateType = new Date(Xrm.Page.getAttribute(filedName).getValue());
                if (DateType != "Invalid Date") {
                    //日期格式
                    targetVal = new Date(targetVal).getTime();
                    sourceVal = new Date(sourceVal).getTime();
                }
                break;
            case "multiselectoptionset"://多选选项集
                if (targetVal) {
                    var centerValue = "";
                    for (var i in targetVal) {
                        centerValue += targetVal[i] + ","
                    }
                    targetVal = centerValue.replace(/(.*),/, '$1');;
                }
                else {
                    targetVal = null;
                }
                break;
            case "lookup"://查找字段
                if (targetVal) {
                    targetVal = targetVal[0].id.replace("{", "").replace("}", "").toLowerCase();
                } else {
                    targetVal = "";
                }
                sourceVal = data["_" + targetFieldKey + "_value"];
                if (sourceVal) {
                    sourceVal = sourceVal.toLowerCase();
                }
                break;
            default:
        }
        if (!compare(sourceVal, targetVal)) {
            parent.$("#" + targetFieldKey + "_cl").css("cssText", "color:red!important");
        }
    }
}
    }
}

这个是弹窗样式

/**
 * PostbirdAlertBox.js
 * -    原生javascript弹框插件
 * Author:  Postbird 
 * License: MIT
 * Date:    2017-09-23
 */
* {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}

.postbird-box-container {
    width: 100%;
    height: 100%;
    overflow: hidden;
    position: fixed;
    top: 0;
    left: 0;
    z-index: 9999;
    background-color: rgba(0, 0, 0, 0.2);
    display: block;
    -webkit-user-select: none;
    -moz-user-select: none;
    -ms-user-select: none;
    user-select: none;
}

    .postbird-box-container.active {
        display: block;
    }

.postbird-box-content {
    width: 400px;
    max-width: 90%;
    min-height: 150px;
    background-color: #fff;
    border: solid 1px #dfdfdf;
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    /* margin-top: -100px; */
}

.postbird-box-header {
    width: 100%;
    padding: 10px 15px;
    position: relative;
    font-size: 1.1em;
    letter-spacing: 2px;
}

.postbird-box-close-btn {
    cursor: pointer;
    font-weight: 700;
    color: #000;
    float: right;
    opacity: 0.5;
    font-size: 1.3em;
    margin-top: -3px;
    display: none;
}

    .postbird-box-close-btn:hover {
        opacity: 1;
    }

.postbird-box-text {
    width: 100%;
    padding: 0 10%;
    text-align: center;
    line-height: 40px;
    font-size: 20px;
    letter-spacing: 1px;
}

.postbird-box-footer {
    width: 100%;
    position: absolute;
    bottom: 0;
    padding: 0;
    margin: 0;
    display: flex;
    display: -webkit-flex;
    justify-content: space-around;
    border-top: solid 1px #dfdfdf;
    align-items: flex-end;
}

    .postbird-box-footer .btn-footer {
        line-height: 44px;
        border: 0;
        cursor: pointer;
        background-color: #fff;
        color: #0e90d2;
        font-size: 1.1em;
        letter-spacing: 2px;
        transition: background-color .5s;
        -webkit-transition: background-color .5s;
        -o-transition: background-color .5s;
        -moz-transition: background-color .5s;
        outline: 0;
    }

        .postbird-box-footer .btn-footer:hover {
            background-color: #e5e5e5;
        }

    .postbird-box-footer .btn-block-footer {
        width: 100%;
    }

    .postbird-box-footer .btn-left-footer,
    .postbird-box-footer .btn-right-footer {
        position: relative;
        width: 100%;
    }

        .postbird-box-footer .btn-left-footer::after {
            content: "";
            position: absolute;
            right: 0;
            top: 0;
            background-color: #e5e5e5;
            height: 100%;
            width: 1px;
        }

    .postbird-box-footer .btn-footer-cancel {
        color: #333333;
    }

.postbird-prompt-input {
    width: 100%;
    font-size: 16px;
    border: 1px solid #cccccc;
    outline: none;
    padding: 5px 10px 5px 10px;
}

后端

//===================================================
//  Copyright @  优文途新科技(上海)有限公司 2021
//  作者:杨海
//  时间:2021-07-31
//  说明:Dynamic工具类
//===================================================
using Microsoft.Crm.Sdk.Messages;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Query;
using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Text;

namespace DLL
{
    public class DynamicHelper
    {
        /// <summary>
        /// 共享记录
        /// </summary>
        /// <param name="service"></param>
        /// <param name="teamOrSystem">要共享给用户或者团队</param>
        /// <param name="target">要共享的记录</param>
        public void Grant(IOrganizationService service, EntityReference teamOrSystem, EntityReference target)
        {
            GrantAccessRequest grantAccessRequest = new GrantAccessRequest
            {
                PrincipalAccess = new PrincipalAccess
                {
                    Principal = teamOrSystem,
                    //共享的权限 读、写、共享、追加、追加到
                    AccessMask = AccessRights.ReadAccess | AccessRights.WriteAccess | AccessRights.ShareAccess | AccessRights.AppendAccess | AccessRights.AppendToAccess
                },
                Target = target,
            };
            service.Execute(grantAccessRequest);
        }
        /// <summary>
        /// 清除共享记录
        /// </summary>
        /// <param name="service"></param>
        /// <param name="teamOrSystems">要取消共享给用户或者团队集合</param>
        /// <param name="target">取消共享记录</param>
        public void ClearGrant(IOrganizationService service, List<EntityReference> teamOrSystems, EntityReference target)
        {
            foreach (EntityReference item in teamOrSystems)
            {
                RevokeAccessRequest revokeAccessRequest = new RevokeAccessRequest
                {
                    Revokee = item,
                    Target = target,
                };
                service.Execute(revokeAccessRequest);
            }
        }
        /// <summary>
        /// 验证用户对实体是否有读写权限
        /// </summary>
        /// <param name="service"></param>
        /// <param name="entityER">验证实体的信息</param>
        /// <returns>需要在页面上配置【两个选项】类型,名为【new_test_right_control】的字段</returns>
        public bool PermissionsValidation(IOrganizationService service, EntityReference entityER)
        {
            //定义返回信息
            bool mes = false;
            try
            {
                //验证用户查找权限
                QueryExpression q = new QueryExpression();
                q.EntityName = entityER.LogicalName;
                q.ColumnSet = new ColumnSet(true);
                q.Criteria.AddCondition(entityER.LogicalName+"id", ConditionOperator.Equal, entityER.Id);
                EntityCollection e2 = service.RetrieveMultiple(q);//获取实体信息
                if (e2.Entities.Count == 0)
                {
                    //没有查找权限返回false
                    mes = false;
                }
                else
                {
                    //查找权限存在,验证用户是否存在写权限,在页面配置一个两个选项字段,改变其值来测试用户是否存在数据的写权限
                    Entity e = e2.Entities[0];
                    //判断字段是否存在信息
                    if (!e.Attributes.Contains("new_test_right_control"))
                    {
                        e["new_test_right_control"] = false;
                    }
                    else
                    {
                        //判断页面上的值是true还是false,来改变其信息
                        if (Convert.ToBoolean(e.Attributes["new_test_right_control"])) e["new_test_right_control"] = false;
                        else e["new_test_right_control"] = true;
                    }
                    service.Update(e);
                    mes= true;
                }
            }
            catch (Exception)
            {
                mes = false;
            }
            return mes;
        }
        /// <summary>
        /// 后端GET方式调取数据
        /// </summary>
        /// <param name="url">请求地址</param>
        /// <param name="headerValue">请求数据</param>
        /// <returns>"name:value,name1:value1"</returns>
        public string GetRequest(string url,string headerValue)
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            // 设置请求头信息
            WebHeaderCollection headers = new WebHeaderCollection();
            string[] data_1 = headerValue.Split(',');
            foreach (string item in data_1)
            {
                string[] data_2 = item.Split(':');
                headers.Add(data_2[0],data_2[1]);
            }
            //数据传输
            request.UserAgent = null;
            request.Headers = headers;
            request.Method = "GET";
            // 返回请求数据
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            // 返回的状态码
            var httpStatusCode = (int)response.StatusCode;
            // 访问成功,返回数据
            if (httpStatusCode == 200)
            {
                Stream myResponseStream = response.GetResponseStream();
                //数据格式
                StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));
                //读取返回数据
                string retString = myStreamReader.ReadToEnd();
                myStreamReader.Close();
                myResponseStream.Close();
                return retString;
            }
            else
            {   // todo 可以通过返回码判断处理
                throw new Exception("未获取到返回值!");
            }
        }
        /// <summary>
        /// 后端POST方式调取数据
        /// </summary>
        /// <param name="postUrl">请求地址</param>
        /// <param name="paramData">请求数据</param>
        /// <param name="dataEncode">编码格式</param>
        /// <returns>var data=new { vin = car_vin, level = car_level, new_name = car_name };——》传输数据</returns>
        /// <returns>JsonConvert.SerializeObject(data):转化为——》字符串类型</returns>
        public string PostRequest(string postUrl, string paramData, Encoding dataEncode)
        {
            //定义返回信息
            string ret = string.Empty;
            try
            {
                //将信息转化为base64格式数据
                byte[] byteArray = dataEncode.GetBytes(paramData); //转化
                //请求地址
                HttpWebRequest webReq = (HttpWebRequest)WebRequest.Create(new Uri(postUrl));
                //请求方式post
                webReq.Method = "POST";
                //请求类型json类型
                webReq.ContentType = "application/json";
                //请求数据
                webReq.ContentLength = byteArray.Length;
                //保存信息
                Stream newStream = webReq.GetRequestStream();
                //写入参数
                newStream.Write(byteArray, 0, byteArray.Length);
                //关闭写入流
                newStream.Close();
                //请求数据
                HttpWebResponse response = (HttpWebResponse)webReq.GetResponse();
                //获取返回数据
                StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.Default);
                ret = sr.ReadToEnd();
                //关闭流,请求
                sr.Close();
                response.Close();
                newStream.Close();
            }
            catch (Exception e)
            {
                ret = e.Message;
            }
            return ret;
        }
    }
}
原文地址:https://www.cnblogs.com/LanHai12/p/15257952.html