执行插件的替代方式:用JS调用操作
关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复229或者20161028可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong.me 。

public sealed class TestOperations : CodeActivity
{
[Input("操作名称:提交/检测/维修/关闭")]
[Default("提交")]
public InArgument<string> OperationName { get; set; } protected override void Execute(CodeActivityContext executionContext)
{
ITracingService tracingService = executionContext.GetExtension<ITracingService>(); //Create the context
IWorkflowContext context = executionContext.GetExtension<IWorkflowContext>();
IOrganizationServiceFactory serviceFactory = executionContext.GetExtension<IOrganizationServiceFactory>();
IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);
var userid = context.UserId;
var initiatingUserId = context.InitiatingUserId;
tracingService.Trace("userid=" + userid.ToString() + ";initiatingUserId=" + initiatingUserId);
var operationName = executionContext.GetValue<string>(OperationName);
tracingService.Trace("执行的操作是:" + operationName);
if (operationName.Equals("提交"))
{
var testSubEntity = new Entity("ly_testsub");
testSubEntity["ly_name"] = DateTime.Now.ToString();
testSubEntity["ly_test"] = new EntityReference(context.PrimaryEntityName, context.PrimaryEntityId);
service.Create(testSubEntity);
var noteEntity = new Entity("annotation");
noteEntity["objectid"] = new EntityReference(context.PrimaryEntityName, context.PrimaryEntityId);
noteEntity["subject"] = DateTime.Now.ToString();
service.Create(noteEntity);
} }
}
然后我用来做按钮的RibbonDiff如下:
<RibbonDiffXml>
<CustomActions>
<CustomAction Id="ly.ly_test.Submit.Button.CustomAction" Location="Mscrm.Form.ly_test.MainTab.Save.Controls._children" Sequence="75">
<CommandUIDefinition>
<Button Command="ly.ly_test.Submit.Command" Id="ly.ly_test.Submit.Button" Image32by32="/_imgs/ribbon/runreport32.png" Image16by16="/_imgs/ribbon/RunReport_16.png" LabelText="$LocLabels:ly.ly_test.Submit.Button.LabelText" Sequence="75" TemplateAlias="o2" ToolTipTitle="$LocLabels:ly.ly_test.Submit.Button.ToolTipTitle" ToolTipDescription="$LocLabels:ly.ly_test.Submit.Button.ToolTipDescription" />
</CommandUIDefinition>
</CustomAction>
</CustomActions>
<Templates>
<RibbonTemplates Id="Mscrm.Templates" />
</Templates>
<CommandDefinitions>
<CommandDefinition Id="ly.ly_test.Submit.Command">
<EnableRules>
<EnableRule Id="ly.ly_test.submitEnableRule.EnableRule" />
</EnableRules>
<DisplayRules />
<Actions>
<JavaScriptFunction FunctionName="submit" Library="$webresource:ly_/test/js/TestRibbon.js" />
</Actions>
</CommandDefinition>
</CommandDefinitions>
<RuleDefinitions>
<TabDisplayRules />
<DisplayRules>
</DisplayRules>
<EnableRules>
<EnableRule Id="ly.ly_test.submitEnableRule.EnableRule">
<RecordPrivilegeRule AppliesTo="PrimaryEntity" Default="false" InvertResult="false" PrivilegeType="Write" />
<ValueRule Field="statuscode" Value="1" Default="false" InvertResult="false" />
<CustomRule FunctionName="submitEnableRule" Library="$webresource:ly_/test/js/TestRibbon.js" Default="false" InvertResult="false" />
</EnableRule>
</EnableRules>
</RuleDefinitions>
<LocLabels>
<LocLabel Id="ly.ly_test.Submit.Button.LabelText">
<Titles>
<Title description="提交" languagecode="0" />
<Title description="提交" languagecode="2052" />
</Titles>
</LocLabel>
<LocLabel Id="ly.ly_test.Submit.Button.ToolTipTitle">
<Titles>
<Title description="提交" languagecode="0" />
<Title description="提交" languagecode="2052" />
</Titles>
</LocLabel>
<LocLabel Id="ly.ly_test.Submit.Button.ToolTipDescription">
<Titles>
<Title description="提交看看" languagecode="0" />
<Title description="提交看看" languagecode="2052" />
</Titles>
</LocLabel>
</LocLabels>
</RibbonDiffXml>
function submitEnableRule() {
return checkUserHasRoles(Xrm.Page.context.getUserRoles(), ["系统管理员", "代理"]);
}
function submit() {
var clientURL = Xrm.Page.context.getClientUrl();
var recordId = Xrm.Page.data.entity.getId().replace(/^{/, "").replace(/}$/, "");
var req = new XMLHttpRequest()
req.open("POST", encodeURI(clientURL + "/api/data/v8.0/ly_tests(" + recordId + ")/Microsoft.Dynamics.CRM.ly_TestOperation"), false);//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 /* complete */) {
req.onreadystatechange = null;
if (this.status == 204) {//204代表成功无返回值
//刷新页面
Xrm.Page.ui.setFormNotification("操作成功!", 'INFO', '00F041A1-2D30-4B30-9D12-63285716D8ED');
setTimeout(function () {
Xrm.Page.ui.clearFormNotification('00F041A1-2D30-4B30-9D12-63285716D8ED');
Xrm.Utility.openEntityForm(Xrm.Page.data.entity.getEntityName(), Xrm.Page.data.entity.getId());
}, 2000);
}
else {
var error = JSON.parse(this.response).error;
Xrm.Utility.alertDialog("错误:" + error.message);
}
}
};
var requestmsg = {};
requestmsg.OperationName = "提交";
req.send(JSON.stringify(requestmsg));
}
function checkUserHasRoles(roleIdArray, roleNames) {
var roleIds = "", userRoles = [], ret = false;
var clientURL = Xrm.Page.context.getClientUrl();
roleIdArray.forEach(function (element) {
roleIds += "roleid eq " + element + " or ";
});
roleIds = roleIds.replace(/\sor\s$/, '');
var req = new XMLHttpRequest()
req.open("GET", encodeURI(clientURL + "/api/data/v8.1/roles?$select=name&$filter=" + roleIds), false);//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) {
var responseJSON = JSON.parse(this.responseText);
if (responseJSON.value != null && responseJSON.value.length >= 1) {
responseJSON.value.forEach(function (element) {
if (roleNames.some(function (ele) { return ele == element.name })) {
ret = true;
}
});
}
}
}
}
req.send();
return ret;
}
//# sourceURL=TestRibbon.js

执行插件的替代方式:用JS调用操作的更多相关文章
- Js调用本地exe的方式
1. 使用记事本(或其他文本编辑器)创建一个myprotocal.reg文件,并写入以下内容 Windows Registry Editor Version 5.00 [HKEY_CLASSE ...
- js调用后台方法(如果你能容忍执行的后台方法变成一个常量)
最近一直在做一个电话拨号的系统,系统不大,但是做的时间有点长了.其中用到了一个技术:js调用后台方法.解决这个问题花了不少时间,现如今仍然还有些不明白的地方,今天跟大家分享一下.真正明白的同学欢迎指正 ...
- 浅谈js函数三种定义方式 & 四种调用方式 & 调用顺序
在Javascript定义一个函数一般有如下三种方式: 函数关键字(function)语句: function fnMethodName(x){alert(x);} 函数字面量(Function Li ...
- [iOS Hybrid实践:UIWebView中Html中用JS调用OC方法,OC执行JS代码]
原理: 1.JS调用OC 每次webview执行跳转时都会被iOS给拦截,执行下面函数获得系统允许. 因此可以根据跳转信息转给系统,执行相应功能,比如打开相册等. // 网页中的每一个请求都会被触发 ...
- UIWebView中Html中用JS调用OC方法及OC执行JS代码
HTML代码: <html> <head> <title>HTML中用JS调用OC方法</title> <meta http-equiv=&quo ...
- 意外作出了一个javascript的服务器,可以通过js调用并执行任何java(包括 所有java 内核基本库)及C#类库,并最终由 C# 执行你提交的javascript代码! 不敢藏私,特与大家分
最近研发BDC 云开发部署平台的数据路由及服务管理器意外作出了一个javascript的服务器,可以通过js调用并执行任何java(包括 所有java 内核基本库)及C#类库,并最终由 C# 执行你提 ...
- vs2010开发activex(MFC)控件/ie插件(三),js调用ocx控件的接口函数
原文:http://blog.csdn.net/yhhyhhyhhyhh/article/details/50802280 js调用ocx控件的接口函数,先看demo效果: 简单测试过程 ...
- ADO方式,VC调用Execute执行INSERT INTO插入变量SQL语句的写法
ADO方式,VC调用Execute执行INSERT INTO插入变量SQL语句的写法 有些情况下,SQL SERVER 2008r2中需要保存float,int类型的数据,当C 中的变量为double ...
- JS调用函数的两种方式
<script type="text/javascript"> window.onload = init; //onload 表示页面全部加载完毕后,再调用init() ...
随机推荐
- JPA连接Mysql数据库时提示:Table 'jpa.sequence' dosen't exisit
场景 在使用JPA连接Mysql数据库进行数据持久化时提示: Table 'jpa.sequence' dosen't exist 注: 博客主页: https://blog.csdn.net/bad ...
- echarts背景颜色渐变的三种类型
// 线性渐变,多用于折线柱形图,前四个参数分别是 x0, y0, x2, y2, 范围从 0 - 1,相当于在图形包围盒中的百分比,如果 globalCoord 为 `true`,则该四个值是绝对的 ...
- choose Perseverance :)
心里话 很久都没有更新博客了,我会陆陆续续的把云笔记中的一些有意思的文章放在博客中. 这10个月以来经历了很多,9月份参加了省赛获得了一个二等奖,和一等奖失之交臂的滋味很难受,到10月份开始维护自己的 ...
- 【Gradle】自定义Android Gradle工程
自定义Android Gradle工程 defaultConfig默认配置 defaultConfig是Android对象中的一个配置项,负责定义所有的默认配置.一个基本的defaultConfig配 ...
- Java中如何判断一个字符是否是字母或数字
使用Java中Character类的静态方法: Character.isDigit(char c) //判断字符c是否是数字字符,如‘1’,‘2’,是则返回true,否则返回false Chara ...
- Export Receives The Errors ORA-1555 ORA-22924 ORA-1578 ORA-22922 (Doc ID 787004.1)
Export Receives The Errors ORA-1555 ORA-22924 ORA-1578 ORA-22922 (Doc ID 787004.1) APPLIES TO: Oracl ...
- Centos7_防火墙的常用配置(杂记)
Centos6和Centos7防火墙的区别 使用的工具不一样,Centos6使用的是Iptables而Centos7使用的则是Firewall Iptables,用于过滤数据包,属于网络层防火墙 Fi ...
- SPA项目之CRUD+表单验证
1. 表单验证 Form组件提供了表单验证的功能,只需要通过 rules 属性传入约定的验证规则, 并将Form-Item的prop属性设置为需校验的字段名即可 <el-dialog :titl ...
- JUC-8-lock和Condition使用
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAANwAAADHCAYAAABySz3ZAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjw ...
- 如何使用postman判断返回结果是否正确
针对一个接口,我们在知道参数以及参数对应的结果时,可以通过postman进行判断,验证返回数据是否与预期数据相等.这样可以使我们的接口测试更加的方便简洁. 1.准备数据. postman可以接受的文件 ...