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

在Microsoft Bot Framework中获取Adaptive Card DateInput值的问题

解决Microsoft Bot Framework中Adaptive Cards DateInput选择值的获取问题

嘿,我来帮你搞定这个问题——在Bot Framework里获取Adaptive Cards中DateInput的选中值,核心是处理用户提交Card后返回的Activity数据,下面是一步步的解决方案:

1. 先确保你的Adaptive Card配置正确

首先,你的DateInput组件必须设置一个唯一的id,这样后续才能通过这个id定位到用户选择的值。比如你的Card JSON可以这么写:

{
  "type": "AdaptiveCard",
  "version": "1.0",
  "body": [
    {
      "type": "DateInput",
      "id": "selectedAppointmentDate",
      "label": "请选择预约日期"
    }
  ],
  "actions": [
    {
      "type": "Action.Submit",
      "title": "提交选择"
    }
  ]
}

注意:一定要包含Action.Submit按钮,用户点击它才会把DateInput的选中值提交给Bot。

2. 在Bot对话逻辑中接收并解析数据

当用户点击提交按钮后,Bot会收到一条带有Value属性的Activity,这个属性里就包含了所有Card组件的提交数据。结合你提供的代码片段,调整后的完整逻辑大概是这样:

public async Task StartAsync(IDialogContext context)
{
    // 你的现有业务逻辑:获取患者标识符和日期相关数据
    string pIdentifier = serviceFactory.ProfileService.GetPatientIdentifier(nric);
    string response = serviceFactory.DentalAppointmentService.GetSlotSearchDates(nric, apptId, caseNumber, institutionCode, pIdentifier);
    string[] splitResponse = response.Split(...); // 你的原有拆分逻辑

    // 构建包含DateInput的Adaptive Card
    var adaptiveCard = new AdaptiveCard(new AdaptiveSchemaVersion(1, 0))
    {
        Body = {
            new AdaptiveDateInput
            {
                Id = "selectedAppointmentDate",
                Label = "请选择你的预约日期"
            }
        },
        Actions = {
            new AdaptiveSubmitAction
            {
                Title = "提交日期"
            }
        }
    };

    // 将Card附加到消息发送给用户
    var message = context.MakeMessage();
    message.Attachments.Add(new Attachment
    {
        ContentType = AdaptiveCard.ContentType,
        Content = adaptiveCard
    });
    await context.PostAsync(message);

    // 等待用户提交Card的响应
    context.Wait(HandleCardSubmissionAsync);
}

private async Task HandleCardSubmissionAsync(IDialogContext context, IAwaitable<IMessageActivity> result)
{
    var incomingActivity = await result;

    // 检查是否是Adaptive Card的提交数据
    if (incomingActivity.Value != null)
    {
        // 解析提交的JSON数据
        var submittedData = JObject.FromObject(incomingActivity.Value);
        string selectedDateString = submittedData["selectedAppointmentDate"]?.ToString();

        if (!string.IsNullOrEmpty(selectedDateString))
        {
            // 将ISO格式的日期字符串转换为DateTime对象(DateInput返回的是ISO 8601格式,比如2024-05-20)
            if (DateTime.TryParse(selectedDateString, out DateTime selectedDate))
            {
                // 这里可以加入你的业务逻辑,比如根据选中日期查询预约时段
                await context.PostAsync($"已收到你选择的日期:{selectedDate:yyyy-MM-dd}");
            }
            else
            {
                await context.PostAsync("抱歉,无法解析你选择的日期,请重新尝试。");
            }
        }
        else
        {
            await context.PostAsync("请先选择一个有效的日期再提交。");
        }
    }
    else
    {
        // 处理用户发送的普通文本消息
        await context.PostAsync("请使用卡片上的日期选择器来提交你的预约日期哦。");
    }

    // 继续等待用户的下一次操作(根据你的对话流程调整,比如结束对话或者进入下一个步骤)
    context.Wait(HandleCardSubmissionAsync);
}

3. 关键注意事项

  • DateInput返回的日期格式是ISO 8601标准格式(YYYY-MM-DD),所以可以直接用DateTime.TryParse转换为DateTime对象。
  • 如果你的Bot使用的是Dialogs V2及以上版本,核心逻辑还是读取Activity.Value,只是对话管理的方式略有不同,本质是一样的。
  • 一定要保证DateInput的id在Card中是唯一的,避免和其他组件的id冲突。

内容的提问来源于stack exchange,提问作者Fabian

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:48:57