Bot Framework中CancelablePromptString/Double通用取消实现咨询
实现通用可取消提示的思路
我之前在Bot Framework开发中也碰到过这个需求,其实不用找现成的实现,参考你看到的CancelablePromptChoice逻辑,自己封装出CancelablePromptString和CancelablePromptDouble非常简单——核心就是在识别用户输入前先拦截取消指令,再处理正常输入。
核心实现逻辑
自定义Prompt类时,主要重写RecognizeAsync方法:
- 先检查用户输入是否为
cancel或abort(你也可以根据需求扩展更多关键词) - 如果是取消指令,直接返回带有
Cancel状态的识别结果 - 如果不是,调用基类的默认识别逻辑处理对应类型的输入
CancelablePromptString 示例代码
using Microsoft.Bot.Builder.Dialogs; using Microsoft.Bot.Schema; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; public class CancelablePromptString : Prompt<string> { private readonly List<string> _cancelKeywords = new List<string> { "cancel", "abort" }; public CancelablePromptString(string dialogId, PromptValidator<string> validator = null) : base(dialogId, validator) { } protected override async Task<PromptRecognizerResult<string>> RecognizeAsync(ITurnContext turnContext, PromptOptions options, CancellationToken cancellationToken) { var result = new PromptRecognizerResult<string>(); // 检查是否是取消指令 if (turnContext.Activity.Type == ActivityTypes.Message) { var input = turnContext.Activity.Text?.Trim().ToLowerInvariant(); if (_cancelKeywords.Contains(input)) { result.Status = PromptStatus.Canceled; return result; } } // 调用基类的字符串识别逻辑 return await base.RecognizeAsync(turnContext, options, cancellationToken); } }
CancelablePromptDouble 示例代码
using Microsoft.Bot.Builder.Dialogs; using Microsoft.Bot.Schema; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; public class CancelablePromptDouble : Prompt<double> { private readonly List<string> _cancelKeywords = new List<string> { "cancel", "abort" }; public CancelablePromptDouble(string dialogId, PromptValidator<double> validator = null) : base(dialogId, validator) { } protected override async Task<PromptRecognizerResult<double>> RecognizeAsync(ITurnContext turnContext, PromptOptions options, CancellationToken cancellationToken) { var result = new PromptRecognizerResult<double>(); // 检查取消指令 if (turnContext.Activity.Type == ActivityTypes.Message) { var input = turnContext.Activity.Text?.Trim().ToLowerInvariant(); if (_cancelKeywords.Contains(input)) { result.Status = PromptStatus.Canceled; return result; } } // 调用基类的数字识别逻辑 return await base.RecognizeAsync(turnContext, options, cancellationToken); } }
使用方式
在对话框中调用时,和普通Prompt的用法完全一致,当用户输入cancel或abort时,提示会返回Canceled状态,你可以在后续逻辑中处理取消流程:
// 示例:使用CancelablePromptString var promptOptions = new PromptOptions { Prompt = MessageFactory.Text("请输入你的姓名:") }; var promptResult = await dc.PromptAsync(nameof(CancelablePromptString), promptOptions); if (promptResult.Status == DialogTurnStatus.Complete) { var userName = promptResult.Result; // 处理正常输入逻辑 } else if (promptResult.Status == DialogTurnStatus.Cancelled) { await dc.Context.SendActivityAsync("已取消当前操作"); // 处理取消后的逻辑 }
你还可以进一步封装一个通用基类,把取消检查的逻辑抽出来,避免重复代码,后续扩展其他类型的可取消提示会更高效。
内容的提问来源于stack exchange,提问作者Sandip
相关产品推荐
相关产品推荐

