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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:19:20