今天想实现一个Search Product的功能,首先要将数据展示在页面,然后前端根据查询需求进行处理。之前是在salesforce中实现的,可以定义一个Search Product的页面,然后在页面中访问查询数据的Webservice即可。但是在Dynamic 365中并没有这种直接调用的方式,最终找到一种方式就是,前端页面通过Js调用工作流中的Action,而在Action上绑定了插件。


实现效果

(1) 实现html页面并导入系统

在设置中找到自定义项,然后进去自定义系统,选择Web资源,然后将之前做好的页面上传到系统。

(2) 自定义Action

首先新建一个action,实体设置上可以设置为全局的,也可以单独设定某个实体。

注意:

注册该action,方法同插件注册,在注册step时message选择我们的action的唯一名称,很多人在这一步的message里不显示action的名字,确保两点:第一你的action激活了,第二你的插件注册器是在你激活action后再打开的。

设置好action,这边设置了两个输入参数和一个输出参数,设置完后保存并且激活。

(3) 开发Plugin项目

这里我们简单介绍一下插件的基本用法
1. 要继承IPlugin,并实现Excute方法。
2. 从Service provider里获取执行上下文
3. 我们可以检查出发插件的实体名称
4. 还可以检查触发的事件,是creat, update还是delete
5. 输入参数里获取触发的实体
6. 通过service factory获取IOrganizationService,当CreateOrganizationService方法的参数为null时,表示的是系统用户,当参数为context.UserId 或Guid.Empty时,表示的是当前用户
7. 最后是DoAction方法,插件的逻辑就可以在这里实现了。
以下是实现插件的代码:

public void Execute(IServiceProvider serviceProvider){IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);//传入两个参数String InParameters1 = context.InputParameters["InParameters1"] as String;String InParameters2 = context.InputParameters["InParameters2"] as String;//查询//EntityReference entityRef = context.InputParameters["Target"] as EntityReference;string fetchProductXml = @"<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'><entity name='new_be_eligible_pn__c'><attribute name='new_be_eligible_pn__cid' /><attribute name='new_name' /><attribute name='createdon' /><attribute name='new_value_category__c' /><attribute name='new_is_tp_part__c' /><attribute name='new_country__c' /><attribute name='new_available_quantity_flag__c' /><order attribute='new_name' descending='false' /><filter type='and'><condition attribute='new_country__c' operator='eq' value='Italy' /></filter><link-entity name='new_product' from='new_productid' to='new_product__c' link-type='inner' alias='a_e79f28ae2899e811a96f000d3a828e6c'><attribute name='new_wifi__c' /><attribute name='new_warranty__c' /><attribute name='new_type__c' /><attribute name='new_sub_series__c' /><attribute name='new_series__c' /><attribute name='new_screen_size__c' /><attribute name='new_name' /><attribute name='new_product_hierarchy__c' /><attribute name='new_description' /><attribute name='new_productcode' /><attribute name='new_os__c' /><attribute name='new_memory__c' /><attribute name='new_hdd__c' /><attribute name='new_cpu__c' /><attribute name='new_brand__c' /><attribute name='new_battery__c' /><filter type='and'><filter type='or'><condition attribute='new_type__c' operator='like' value='%PC System Unit%' /><condition attribute='new_type__c' operator='eq' value='Non System Unit' /></filter></filter></link-entity><link-entity name='new_product_sales_country__c' from='new_product_sales_country__cid' to='new_psc__c' link-type='inner' alias='a_c278acd92899e811a96f000d3a828e6c'><attribute name='new_currencyisocode' /><attribute name='new_channel_price__c' /><filter type='and'><condition attribute='new_sales_status__c' operator='like' value='%12%' /></filter></link-entity></entity></fetch>";EntityCollection products = service.RetrieveMultiple(new FetchExpression(fetchProductXml));//传出参数context.OutputParameters["OutParameters"] = products;//遍历productsforeach (var pair in products.Entities){foreach (var pa in pair.Attributes){Console.WriteLine(pa.Key + ": " + pa.Value);}}Console.WriteLine(products);}

(4)数据查询方式,本篇使用FetchXML

在以上的代码实现中,我使用了FetchXML的方式实现,对于多条件跨表查询,返回多条记录很方便。常用的结构如下,
SDK中有很多类似的案例。

其中XML这块我们可以使用高级查询来自动生成

最后我们可以导出XML文件

(5)Js调用自定义的Action

最后可以看到输出结果:

总结:

在on-premises的开发中我们往往把复杂的业务处理逻辑封装成接口供前端js调用,但在online的开发中这样的开发方式无疑增加了成本(需另外架设服务器,添置域名,配置https协议证书等),通过web api调用action给我们提供了新的可行的方式。实现了需求。在下一章我们将分享如何调试插件。

【转】Dynamics CRM 365零基础入门学习(三)Dynamics 通过Web API 来调用自定义的Action(使用插件)相关推荐

  1. 【转】Dynamics CRM 365零基础入门学习(二)Dynamics 插件注册的基本流程

    插件的官方定义是:插件是可与 Microsoft Dynamics CRM 365 和 Microsoft Dynamics CRM Online 集成的自定义业务逻辑(代码),用于修改或增加平台的标 ...

  2. 【转】Dynamics CRM 365零基础入门学习(一)Dynamics介绍以及开发工具配置

    由于公司CRM平台从Salesforce向Dynamic 365转型,因此全身心投入学习了几天Dynamic 365,国内相关的资料很少,所以总结这几天学到东西,以避免初学者走弯路. 本章分享内容介绍 ...

  3. 【转】Dynamics CRM 365零基础入门学习(五)权限管理

    一:安全角色 Microsoft Dynamics 365中的安全角色是各种实体的特权和访问级别矩阵. 它们根据其功能分组在不同的选项卡下. 这些组包括:核心记录,营销,销售,服务,业务管理,服务管理 ...

  4. 【转】Dynamics CRM 365零基础入门学习(七)Dynamics 365 DataMigrationUtility tool使用

    SDK里有个工具叫DataMigrationUtility,这个工具适合两个CRM系统之间的数据迁移.例如:在项目上线之初会做数据初始化的工作,一般这个工作会在UAT开始前完成,当UAT完成之后再把这 ...

  5. 【转】Dynamics CRM 365零基础入门学习(四)Dynamics 使用profiler插件调试流程

    今天我们介绍一种在dynamics开发中经常会用到的调试操作,其中一种调试方式即是profile调试.以下是我在项目开发中记录的调试流程,可供参考使用. 1.打开插件注册工具,会看到install P ...

  6. 零基础入门学习Python,我与python的第一次亲密接触后的感受!

    前言:Python是适合初学者入门最好的语言 Python适合初学者入门最好的语言 人工智能用Python?高考要加入Python?现在连微软官方Excel都要把Python作为官方语言!Python ...

  7. 零基础入门学习Python,我与python的第一次亲密接触后的感受

    前言:Python是适合初学者入门最好的语言 Python适合初学者入门最好的语言 人工智能用Python?高考要加入Python?现在连微软官方Excel都要把Python作为官方语言!Python ...

  8. 零基础学python 视频_零基础入门学习PYTHON(第2版)(微课视频版)

    小甲鱼畅销图书重磅升级,针对Python 3.7,通过生动的实例,让读者在实践中理解概念,在轻松.愉快中学会Python! 本书提倡理解为主,应用为王.因此,只要有可能,小甲鱼(注:作者)都会通过生动 ...

  9. 零基础入门学习Python(33)-图形用户界面编程(GUI编程)EasyGui

    用户界面编程,即平时说的GUI(Graphical User Interface)编程,那些带有按钮.文本.输入框的窗口的编程 EasyGui是一个非常简单的GUI模块,一旦导入EasyGui模块,P ...

最新文章

  1. python3 面向对象(一)
  2. 一个支付案例,学会策略模式!
  3. 【剑指offer-Java版】41和为s的两个数字VS和为s的连续正数序列
  4. kickstart+tftp部署redhat系统
  5. c 获取char*的长度_C/C++编程笔记:C语言字符串比较函数,超详细,值得收藏
  6. 【网络通信与信息安全】之深入解析TCP的“拥塞控制”原理
  7. 2020mysql安装教程_2020MySQL安装图文教程
  8. 前端实现数字快速递增_天正CAD教程之递增文字应用实例
  9. python一个中文占几个字节_python中英文字母和中文汉字所占的字节
  10. 压测学习总结(3)——Jmeter 脚本如何生成
  11. C++中常量指针,指针常量(const 和*)的使用方法和理解方法
  12. 数据结构上机实践第五周项目1- 建立顺序栈算法库
  13. 嵌入式、单片机开发必备软件
  14. 项目盈利模式分析报告
  15. Java 下载 Excel模板
  16. think in java interview-高级开发人员面试宝典(十)
  17. Android常用控件-01
  18. 《Hud 2589》Phalanx详解
  19. 小酷智慧地图3D导览v1.0.82 打卡定位 地图打卡
  20. osi七层模型_4、OSI七层模型简介

热门文章

  1. MapReduce 中的两表 join 几种方案简介
  2. Unity3D性能优化之Draw Call Batching
  3. 12、OpenCV Python 图像梯度
  4. HDU 1159 Common Subsequence 动态规划
  5. 一些常用且实用的原生 JavaScript函数[转]
  6. VB用API实现各种对话框(总结)(转载)
  7. ajax时间控件,带有ajax的JQuery中的插件datetimepicker出错
  8. redis实现轮询算法_【07期】Redis中是如何实现分布式锁的?
  9. ff14拆区后哪个服务器人最多,FF14拆区可以转服吗 拆区期间转服教程
  10. controller调用controller的方法_SpringCloud(5):Feign整合Ribbon和Hystrix来进行远程调用与服务熔断...