执行插件的替代方式:用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() ...
随机推荐
- 微信小程序头像为什么是模糊的?小程序头像模糊怎么办?
「柒留言」更新的换国旗头像小功能,获取头像显示模糊... 1.头像模糊 国庆之前,更新了「柒留言」小程序加国旗头像的小功能,但是头像模糊这个坑我在发布新版之前还没解决. 一直以为是代码出了问题,各种搜 ...
- 【转载】Android App应用启动分析与优化
前言: 昨晚新版本终于发布了,但是还是记得有测试反馈app启动好长时间也没进入app主页,所以今天准备加个班总结一下App启动那些事! app的启动方式: 1.)冷启动 当启动应用时,后台没有该应用 ...
- ABP入门教程13 - 更新菜单
点这里进入ABP入门教程目录 菜单更新 在展示层(即JD.CRS.Web.Mvc)的Startup下打开CRSNavigationProvider.cs //用以存放菜单相关信息 修改如下 using ...
- Fundebug网站升级HTTP/2,真的变快了!
作为新一代的HTTP协议,HTTP/2可以提高网站性能,优化用户体验,Fundebug也是时候升级HTTP/2了,虽然已经有点晚了. 升级HTTP/2是一件很简单的事情,改1行Nginx配置就好了,但 ...
- 电池的QPNP模式
名词解释: CV:Constant Voltage恒压 SMMB charger:Switch-ModeBattery Charger and Boost peripheral开关模式电池充电器和升压 ...
- Python-判断回文
# 回文单词是从左到右和从右到左读相同的单词. # 例如:"detartrated"和"evitative"是回文 str_in = input('Input: ...
- Centos7配置桥接网络
- python配置yaml
我们在做自动化的过程中无论是接口自动化还是UI自动化都会存在很多数据,我们对于自动化中如何存放这些数据也是很重要一点,如果写在代码里的话,每次更换数据就有点繁琐,我们可以通过一个文件存放这些数据,然后 ...
- 我的朋友&值得学习的大佬
@media only screen and (max-width: 360px) { #friedsGroup { columns: 1 !important; } } #MySignature{ ...
- new和delete创建和释放动态数组
1.动态创建和释放一维数组 #include<iostream> using namespace std; int main() { int n; cin>>n; //分配动态 ...