You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Dynamics 365搜索页JS获取的表单值传入C#文件?

在Dynamics 365中实现JS向C#传值的几种可行方式

针对你在Dynamics 365搜索页中需要将JS收集的表单参数传入C#逻辑的场景,以下是几种成熟的实现方案,可根据你的需求选择:

1. 使用自定义API(推荐)

这是Dynamics 365官方推荐的方式,适合在平台内封装业务逻辑,无需依赖外部服务,配置和维护都更便捷。

实现步骤:

    1. 在Dynamics 365中创建自定义API,定义需要的输入参数(比如搜索关键词、日期范围等),可选定义输出参数用于返回搜索结果。
    1. 编写C#类实现ICustomApiExecutor接口,在Execute方法中获取传入的参数并执行搜索逻辑。
    1. 在JS中通过Xrm.WebApi.online.execute调用自定义API,传递收集到的表单参数。

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配合插件实现传值。

实现步骤:

    1. 在Dynamics 365中创建自定义Action,定义输入参数。
    1. 注册插件到该Action的Execute消息上,在插件中获取参数并执行逻辑。
    1. JS中通过Xrm.WebApi.online.execute调用自定义Action,传递参数。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 16:07:10