如何将Dynamics 365搜索页JS获取的表单值传入C#文件?
在Dynamics 365中实现JS向C#传值的几种可行方式
针对你在Dynamics 365搜索页中需要将JS收集的表单参数传入C#逻辑的场景,以下是几种成熟的实现方案,可根据你的需求选择:
1. 使用自定义API(推荐)
这是Dynamics 365官方推荐的方式,适合在平台内封装业务逻辑,无需依赖外部服务,配置和维护都更便捷。
实现步骤:
- 在Dynamics 365中创建自定义API,定义需要的输入参数(比如搜索关键词、日期范围等),可选定义输出参数用于返回搜索结果。
- 编写C#类实现
ICustomApiExecutor接口,在Execute方法中获取传入的参数并执行搜索逻辑。
- 编写C#类实现
- 在JS中通过
Xrm.WebApi.online.execute调用自定义API,传递收集到的表单参数。
- 在JS中通过
JS代码示例:
// 收集表单中的搜索参数 const searchFormData = { keyword: document.getElementById("searchKeyword").value.trim(), startDate: document.getElementById("startDate").value, endDate: document.getElementById("endDate").value }; // 构造自定义API请求 const customApiRequest = { name: "new_SearchRecords", // 替换为你的自定义API名称 parameters: { "new_keyword": searchFormData.keyword, "new_startdate": searchFormData.startDate, "new_enddate": searchFormData.endDate } }; // 调用自定义API Xrm.WebApi.online.execute(customApiRequest).then( function (response) { if (response.ok) { return response.json(); } throw new Error("调用自定义API失败"); }, function (error) { console.error("错误信息:", error.message); } ).then(function (result) { // 处理返回的搜索结果 console.log("搜索结果:", result.new_searchresults); });
C#自定义API实现示例:
using Microsoft.Xrm.Sdk; using Microsoft.Xrm.Sdk.Extensions; using Microsoft.Xrm.Sdk.Query; using System.Linq; public class SearchRecordsExecutor : ICustomApiExecutor { public void Execute(ICustomApiExecutionContext context) { // 从上下文获取传入的参数 string keyword = context.GetInputParameter<string>("new_keyword"); DateTime startDate = context.GetInputParameter<DateTime>("new_startdate"); DateTime endDate = context.GetInputParameter<DateTime>("new_enddate"); // 获取组织服务实例 IOrganizationService service = context.GetOrganizationService(); // 构造查询逻辑(示例:查询自定义实体new_record) QueryExpression query = new QueryExpression("new_record") { ColumnSet = new ColumnSet("new_name", "new_date", "new_description"), Criteria = new FilterExpression { Conditions = { new ConditionExpression("new_name", ConditionOperator.Like, $"%{keyword}%"), new ConditionExpression("new_date", ConditionOperator.Between, startDate, endDate) } } }; // 执行查询 EntityCollection searchResults = service.RetrieveMultiple(query); // 将结果转为可序列化的格式,设置为输出参数(如果需要返回给JS) var formattedResults = searchResults.Entities.Select(e => new { Name = e.GetAttributeValue<string>("new_name"), Date = e.GetAttributeValue<DateTime>("new_date"), Description = e.GetAttributeValue<string>("new_description") }).ToList(); context.SetOutputParameter("new_searchresults", formattedResults); } }
2. 使用自定义Action + 插件
如果需要和实体操作绑定,或者已有插件开发经验,可以通过自定义Action配合插件实现传值。
实现步骤:
- 在Dynamics 365中创建自定义Action,定义输入参数。
- 注册插件到该Action的
Execute消息上,在插件中获取参数并执行逻辑。
- 注册插件到该Action的
- JS中通过
Xrm.WebApi.online.execute调用自定义Action,传递参数。
- JS中通过
JS代码示例:
const searchParams = { keyword: document.getElementById("searchKeyword").value, startDate: document.getElementById("startDate").value }; const actionRequest = { entityName: "new_record", // 可以是任意实体,无实体的Action则留空或用"none" actionName: "new_RunSearch", // 替换为你的自定义Action名称 parameters: { "new_keyword": searchParams.keyword, "new_startdate": searchParams.startDate } }; Xrm.WebApi.online.execute(actionRequest).then( success => { /* 处理结果 */ }, error => { console.error(error); } );
C#插件示例:
using Microsoft.Xrm.Sdk; public class SearchPlugin : IPlugin { 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); // 获取输入参数 if (context.InputParameters.Contains("new_keyword")) { string keyword = context.InputParameters["new_keyword"].ToString(); DateTime startDate = (DateTime)context.InputParameters["new_startdate"]; // 执行搜索逻辑... } } }
3. 使用外部Web服务(如Azure Function/ASP.NET Web API)
如果你的搜索逻辑需要调用外部资源,或者有复杂的业务处理,可以搭建外部Web服务,JS直接调用该服务的接口传递参数。
注意事项:
- 需要配置Dynamics 365的CORS策略,允许调用外部服务的域名。
- 要做好认证(比如使用Azure AD OAuth2、API Key等),确保接口安全。
JS代码示例:
const searchData = { keyword: document.getElementById("searchKeyword").value, startDate: document.getElementById("startDate").value }; // 调用外部Web服务接口 fetch("https://your-service-url/api/performsearch", { method: "POST", headers: { "Content-Type": "application/json", "Authorization": "Bearer " + await getCurrentUserAccessToken() // 自定义获取令牌的方法 }, body: JSON.stringify(searchData) }) .then(response => response.json()) .then(results => { /* 处理搜索结果 */ }) .catch(err => console.error("调用外部服务失败:", err)); // 辅助方法:获取当前用户的Azure AD令牌(示例) async function getCurrentUserAccessToken() { const userInfo = await Xrm.WebApi.retrieveRecord("systemuser", Xrm.Utility.getGlobalContext().userSettings.userId, "?$select=azureadobjectid"); // 这里需要结合Azure AD认证逻辑获取令牌,或者使用Xrm.WebApi的内置认证 // 实际场景中可能需要使用MSAL.js等库 }
C# Azure Function示例:
using Microsoft.AspNetCore.Mvc; using Microsoft.Azure.WebJobs; using Microsoft.Azure.WebJobs.Extensions.Http; using Microsoft.AspNetCore.Http; using Newtonsoft.Json; public static class SearchFunction { [FunctionName("PerformSearch")] public static IActionResult Run( [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = "performsearch")] HttpRequest req) { string requestBody = new StreamReader(req.Body).ReadToEnd(); SearchRequest request = JsonConvert.DeserializeObject<SearchRequest>(requestBody); // 执行搜索逻辑:比如调用Dynamics 365 Web API查询数据 // ... return new OkObjectResult(searchResults); } public class SearchRequest { public string Keyword { get; set; } public string StartDate { get; set; } } }
内容的提问来源于stack exchange,提问作者Sristi Jain
相关产品推荐
相关产品推荐

