在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
相关产品推荐
相关产品推荐

