在Dynamics CRM中使用Bootstrap
我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面的微软最有价值专家(Microsoft MVP),欢迎关注我的微信公众号 MSFTDynamics365erLuoYong ,回复165或者20151023可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!
var service = GetOrganizationService();
var entity = new Entity("webresource");
entity["name"] = "new_/common/fonts/glyphicons-halflings-regular.eot";
entity["displayname"] = "glyphicons-halflings-regular.eot";
using (FileStream fs = File.OpenRead(@"C:\Users\luoyong\Downloads\bootstrap-3.3.5-dist\bootstrap-3.3.5-dist\fonts\glyphicons-halflings-regular.eot"))
{
byte[] bytes = new byte[fs.Length];
fs.Read(bytes, , bytes.Length);
entity["content"] = Convert.ToBase64String(bytes);
}
entity["webresourcetype"] = new OptionSetValue();//XML
service.Create(entity);
static void Main(string[] args)
{
var service = GetOrganizationService();
const string bootstrapBaseDir = @"C:\Users\luoyong\Downloads\bootstrap-3.3.5-dist\bootstrap-3.3.5-dist\";
const string solutionPrefix = "new_";
Dictionary<string, string> files = new Dictionary<string, string>();//bootstrap依赖的Web资源
files.Add("glyphicons-halflings-regular.eot", "fonts");
files.Add("glyphicons-halflings-regular.svg", "fonts");
files.Add("glyphicons-halflings-regular.ttf", "fonts");
files.Add("glyphicons-halflings-regular.woff", "fonts");
files.Add("glyphicons-halflings-regular.woff2", "fonts");
files.Add("bootstrap.min.js", "js");
files.Add("jquery-1.11.3.min.js", "js");
files.Add("bootstrap.min.css", "css");
files.Add("bootstrap-theme.min.css", "css");
//处理css文件,记得要替换fonts文件夹中的内容
foreach (var item in (from item in files where item.Value == "css" select item).ToDictionary(item => item.Key, item => item.Value))
{
var fontEntity = new Entity("webresource");
fontEntity["displayname"] = item.Key;
string text = File.ReadAllText(@bootstrapBaseDir + item.Value + "\\" + item.Key);
foreach (var fontitem in (from fontitem in files where fontitem.Value == "fonts" select fontitem).ToDictionary(fontitem => fontitem.Key, fontitem => fontitem.Value))
{
text = text.Replace(fontitem.Key, fontitem.Key.Replace("-", "_"));
}
File.WriteAllText(@bootstrapBaseDir + item.Value + "\\" + item.Key, text);
using (FileStream fs = File.OpenRead(@bootstrapBaseDir + item.Value + "\\" + item.Key))
{
byte[] bytes = new byte[fs.Length];
fs.Read(bytes, , bytes.Length);
fontEntity["content"] = Convert.ToBase64String(bytes);
}
fontEntity["webresourcetype"] = new OptionSetValue();//CSS
fontEntity["name"] = solutionPrefix + @"/common/css/" + item.Key.Replace("-", "_");
service.Create(fontEntity);
}
//处理fonts文件夹
foreach (var item in (from item in files where item.Value == "fonts" select item).ToDictionary(item => item.Key, item => item.Value))
{
var fontEntity = new Entity("webresource");
fontEntity["displayname"] = item.Key;
using (FileStream fs = File.OpenRead(@bootstrapBaseDir + item.Value + "\\" + item.Key))
{
byte[] bytes = new byte[fs.Length];
fs.Read(bytes, , bytes.Length);
fontEntity["content"] = Convert.ToBase64String(bytes);
}
fontEntity["webresourcetype"] = new OptionSetValue();//XML
fontEntity["name"] = solutionPrefix + @"/common/fonts/" + item.Key.Replace("-", "_");
service.Create(fontEntity);
}
//处理js文件夹
foreach (var item in (from item in files where item.Value == "js" select item).ToDictionary(item => item.Key, item => item.Value))
{
var fontEntity = new Entity("webresource");
fontEntity["displayname"] = item.Key;
using (FileStream fs = File.OpenRead(@bootstrapBaseDir + item.Value + "\\" + item.Key))
{
byte[] bytes = new byte[fs.Length];
fs.Read(bytes, , bytes.Length);
fontEntity["content"] = Convert.ToBase64String(bytes);
}
fontEntity["webresourcetype"] = new OptionSetValue();//javascript
var pattern = @"jquery.*min\.js";//用正则表达式替换juery版本号
Regex rgx = new Regex(pattern);
fontEntity["name"] = solutionPrefix + @"/common/js/" + rgx.Replace(item.Key.Replace("-", "_"),"jquery.min.js");
service.Create(fontEntity);
}
Console.WriteLine("程序运行完成!");
Console.ReadKey();
}
<!DOCTYPE html>
<html>
<head>
<title>微软MVP罗勇测试注释</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="../common/css/bootstrap.min.css">
</head>
<body>
<div class="container-fluid">
<table id="notestable" class="table table-striped table-bordered table-hover table-condensed">
<thead>
<tr>
<th class="text-nowrap">序号</th>
<th>注释标题</th>
<th>注释内容</th>
<th>创建人</th>
<th>创建时间</th>
<th>修改人</th>
<th>修改时间</th>
<th>附件名称</th>
<th class="text-nowrap">附件大小(KB)</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
<blockquote class="pull-right">这是微软MVP罗勇学习Bootstrap后的第一次练习!<small>Powered by Bootstrap</small></blockquote>
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
<h4 class="modal-title" id="myModalLabel">附件 <small>罗勇使用Bootstrap做的效果</small></h4>
</div>
<div class="modal-body">
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
</div>
</div>
</div>
</div>
</div>
<script type="text/javascript" src="../../ClientGlobalContext.js.aspx"></script>
<script type="text/javascript" src="../common/js/jquery.min.js"></script>
<script type="text/javascript" src="../common/js/bootstrap.min.js"></script>
<script type="text/javascript" src="../common/XrmServiceToolkit.min.js"></script>
<script type="text/javascript">
Date.prototype.format = function (fmt) {
var o = {
"M+": this.getMonth() + 1,//月份
"d+": this.getDate(),//日
"h+": this.getHours(),//小时
"m+": this.getMinutes(),//分
"s+": this.getSeconds()//秒
};
if (/(y+)/.test(fmt))
fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
for (var k in o)
if (new RegExp("(" + k + ")").test(fmt))
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ?
(o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
return fmt;
} function ShowAttachmentByNoteId(NoteId, MimeType) {
if (MimeType.indexOf("image") > -1) { $(".modal-body").children().remove();
var loadingBtn = $("<button type='button' class='btn btn-info btn-block'>正在加载...</button>");
loadingBtn.appendTo($(".modal-body"));
XrmServiceToolkit.Rest.Retrieve(
NoteId,
"AnnotationSet",
"DocumentBody",
null,
function (result) {
$(".modal-body").children().remove();
var DocumentBody = result.DocumentBody;
var img = $("<img />");
img.attr("alt", "Embedded Image");
img.addClass("img-thumbnail");
img.attr("src", "data:" + MimeType + ";base64," + DocumentBody);
img.appendTo($(".modal-body"));
},
function (error) {
alert(error.message);
},
true
);
}
else if (MimeType.indexOf("officedocument.presentationml.presentation") > -1 || MimeType.indexOf("officedocument.spreadsheetml.sheet") > -1 || MimeType.indexOf("officedocument.wordprocessingml.document") > -1) {//office文档
var warningBtn = $("<button type='button' class='btn btn-info btn-block'>请在新窗口中查看!</button>");
$(".modal-body").children().remove();
warningBtn.appendTo($(".modal-body"));
window.open("https://view.officeapps.live.com/op/view.aspx?src=" + encodeURIComponent("http://mvpluoyong.azurewebsites.net/GetAnnotationDocument.ashx?AnnotationId=" + NoteId));
}
else if (MimeType.indexOf("pdf") > -1) {
var warningBtn = $("<button type='button' class='btn btn-info btn-block'>请在新窗口中查看!</button>");
$(".modal-body").children().remove();
warningBtn.appendTo($(".modal-body"));
window.open("http://mvpluoyong.azurewebsites.net/GetAnnotationDocument.ashx?AnnotationId=" + encodeURIComponent(NoteId));
}
else {
var warningBtn = $("<button type='button' class='btn btn-block btn-warning'>暂时不支持这种文件类型附件的查看!</button>");
$(".modal-body").children().remove();
warningBtn.appendTo($(".modal-body"));
}
} $(function () {
var clientUrl = GetGlobalContext().getClientUrl();
//var id = window.parent.Xrm.Page.data.entity.getId(); //这种方法可以获取表单中的很多信息,包括id
var match = RegExp('[?&]id=([^&]*)').exec(window.location.search);//这里是外接通过url传递id的值过来
var id = match && decodeURIComponent(match[1].replace(/\+/g, ' '));
match = RegExp('[?&]typename=([^&]*)').exec(window.location.search);
var typename = match && decodeURIComponent(match[1].replace(/\+/g, ' '));
XrmServiceToolkit.Rest.RetrieveMultiple(
"AnnotationSet",
"?$select=AnnotationId,Subject,NoteText,MimeType,FileName,FileSize,IsDocument,CreatedOn,CreatedBy,ModifiedOn,ModifiedBy&$filter=ObjectTypeCode eq '" + typename + "' and ObjectId/Id eq guid'" + id + "'&$orderby=CreatedOn asc",
function (results) {
for (var i = 0; i < results.length; i++) {
var tr = $("<tr></tr>");
tr.appendTo($("#notestable tbody"));
var td = $("<td class='text-center'>" + (i + 1) + "</td>");
td.appendTo(tr);
td = $("<td>" + (results[i].Subject == null ? "" : results[i].Subject) + "</td>");
td.appendTo(tr);
td = $("<td><a data-toggle='tooltip' title='点击我在新窗口中查看或者编辑本注释全部内容!' href='" + clientUrl + "/main.aspx?etn=annotation&pagetype=entityrecord&id=%7B" + results[i].AnnotationId + "%7D' target='_blank'>" + results[i].NoteText + (results[i].IsDocument ? " <span class='glyphicon glyphicon-paperclip'></span>" : "") + "</a></td>");
td.appendTo(tr);
td = $("<td>" + results[i].CreatedBy.Name + "</td>");
td.appendTo(tr);
td = $("<td>" + results[i].CreatedOn.format('yyyy-MM-ddThh:mm:ssZ') + "</td>");
td.appendTo(tr);
td = $("<td>" + results[i].ModifiedBy.Name + "</td>");
td.appendTo(tr);
td = $("<td>" + results[i].ModifiedOn.format('yyyy-MM-ddThh:mm:ssZ') + "</td>");
td.appendTo(tr);
td = $("<td>" + (results[i].FileName == null ? "" : ("<a href='#' data-toggle='modal' data-target='#myModal' data-annotationid='" + results[i].AnnotationId + "' data-mimetype='" + results[i].MimeType + "'>" + results[i].FileName + "</a>") + "</td>"));
td.find("a").click(function () {
ShowAttachmentByNoteId($(this).attr("data-annotationid"), $(this).attr("data-mimetype"));
});
td.appendTo(tr);
td = $("<td>" + (results[i].FileSize == null ? "" : Math.round((results[i].FileSize) / 1024)) + "</td>");
td.appendTo(tr);
}
},
function (error) {
alert(error.message);
},
function () {
},
true
);
});
</script>
</body>
</html>
7. 引用效果,引用靠右对齐。
在Dynamics CRM中使用Bootstrap的更多相关文章
- Dyanmics CRM您无法登陆系统。原因可能是您的用户记录或所属的业务部门在Microoft Dynamics CRM中已被禁用
当在操作CRM时,做不论什么的写操作包含创建数据.更新数据.都会提示以下截图中的错误:"您无法登陆系统.原因可能是您的用户记录或所属的业务部门在Microoft Dynamics CRM中已 ...
- Dynamics CRM中一个查找字段引发的【血案】
摘要: 本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复267或者20180311可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyon ...
- Dynamics CRM中的地址知多D?
关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复169或者20151105可方便获取本文,同时可以在第一时间得到我发布的最新的博文信息,follow me! CRM中的地址以前不是很了解,定 ...
- 在Dynamics CRM中自定义一个通用的查看编辑注释页面
关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复162或者20151016可方便获取本文,同时可以在第一时间得到我发布的最新的博文信息,follow me! 注释在CRM中的显示是比较特别, ...
- Dynamics CRM中的注释(Note)及RollupRequest消息初探
关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复161或者20151015可方便获取本文,同时可以在第一时间得到我发布的最新的博文信息,follow me! 注释,这个实体的架构名称是Ann ...
- Dynamics CRM中的操作(action)是否是一个事务(transaction)?
关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复168或者20151104可方便获取本文,同时可以在第一时间得到我发布的最新的博文信息,follow me! 以前的博文 微软Dynamics ...
- Dynamics CRM 中Web API中的深度创建(Deep Insert)
我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...
- 您无法登陆系统。原因可能是您的用户记录或所属的业务部门在Microoft Dynamics CRM中已被禁用
问题发生在CRM 4.0 上 1 用户所在办事处及办事处上级被禁用. 2 如果已经重新启用了,还是报这个错误. 可以把停用的办事处及相关下级再重新--停用--启用一次试试. 3 如果还是报错,查看是否 ...
- 在Dynamics CRM 2015中通过3CX插件(以及3CX windows phone)拨出电话
背景 在On-premises部署的Dynamics CRM中实现通过网页拨通客户电话的功能 要点 3CX 提供了开箱即用的Dynamics CRM Solution,只需要在Microsoft Dy ...
随机推荐
- python 协程与go协程的区别
进程.线程和协程 进程的定义: 进程,是计算机中已运行程序的实体.程序本身只是指令.数据及其组织形式的描述,进程才是程序的真正运行实例. 线程的定义: 操作系统能够进行运算调度的最小单位.它被包含在进 ...
- 15 个优秀开源的 Spring Boot 学习项目,一网打尽!
Spring Boot 算是目前 Java 领域最火的技术栈了,松哥年初出版的 <Spring Boot + Vue 全栈开发实战>迄今为止已经加印了 8 次,Spring Boot 的受 ...
- Prometheus笔记(二)监控go项目实时给grafana展示
欢迎加入go语言学习交流群 636728449 Prometheus笔记(二)监控go项目实时给grafana展示 Prometheus笔记(一)metric type 文章目录 一.promethe ...
- 爬虫学习(二)--爬取360应用市场app信息
欢迎加入python学习交流群 667279387 爬虫学习 爬虫学习(一)-爬取电影天堂下载链接 爬虫学习(二)–爬取360应用市场app信息 代码环境:windows10, python 3.5 ...
- C和C++从零开始系列(二)
今天说一下 C和C++ 的if 条件语句. 在实际编程中,会经常有逻辑判断,比如,输入的数值参数中,如果是奇数,输出This is uneven. 如果是偶数,输出 This is even. 我们在 ...
- MT9V034 全局快门体验总结
MT9V034 全局快门体验总结 部分照片来源网络,尊重版权. . 这个是实物照片 全局快门(相对滚动快门) 拍摄高速物体的效果 高动态效果 低照度和高照度对比 实际拍照效果图(来自网友华健) 特殊应 ...
- Altium PCB二维码Logo设计(转 crazybingo)
Altium PCB二维码Logo设计 每次设计PCB的时候,都会在空白部分放Logo上去,一来板卡显得更充实,二来更有成就感一些... 今天突然想着...这两年二维码越来越火,火到快爆发,不如在板卡 ...
- Orleans[NET Core 3.1] 学习笔记(四)( 1 )创建项目
ClassRoom ClassRoom是一个练手demo,目的是为了能熟悉掌握Orleans的基本知识和使用方法,我会尽量在这个项目中加入更多的知识点,一边学一边练避免我看完文档就忘掉 创建项目 依旧 ...
- 大数据学习笔记——HDFS写入过程源码分析(2)
HDFS写入过程注释解读 & 源码分析 此篇博客承接上一篇未讲完的内容,将会着重分析一下在Namenode获取到元数据后,具体是如何向datanode节点写入真实的数据的 1. 框架图展示 在 ...
- Javascript 垃圾回收方法
Javascript 垃圾回收方法 标记清除(mark and sweep) 这是 JavaScript 最常见的垃圾回收方式,当变量进入执行环境的时候,比如函数中声明一个变量,垃圾回收器将其标记为& ...