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

BotFramework C#中实现循环Prompt直至输入验证通过的技术问询

搞定自定义日期验证Prompt,循环提示直到输入有效

我来帮你完善这个继承PromptString的自定义Prompt类,核心是要重写验证逻辑,让它能检查用户输入的是不是有效日期,同时触发重试机制。这里是完整的可运行代码:

namespace CustomPromptDemo.Models
{
    public class CustomPrompt : PromptString
    {
        // 复用父类构造,设置默认提示、重试文本和最大重试次数
        public CustomPrompt(string Prompt = "Please enter a date", string Retry = "Please enter a valid date!!!", int RetryCount = 3) 
            : base(Prompt, Retry, RetryCount) { }

        // 重写输入验证方法,这是实现日期校验的核心
        protected override async Task<ValidateResult> ValidateInputAsync(IDialogContext context, string input)
        {
            // 尝试把用户输入解析成日期
            if (DateTime.TryParse(input, out DateTime validDate))
            {
                // 输入有效,返回成功结果,还可以把日期格式化后返回
                return new ValidateResult { IsValid = true, Value = validDate.ToString("yyyy-MM-dd") };
            }
            else
            {
                // 输入无效,返回失败,触发重试提示
                return new ValidateResult { IsValid = false };
            }
        }

        // 可选:自定义提示消息,比如加个格式示例帮用户理解
        protected override IMessageActivity MakePrompt(IDialogContext context, string prompt, IReadOnlyList<string> options = null, IReadOnlyList<string> descriptions = null)
        {
            var message = base.MakePrompt(context, prompt, options, descriptions);
            // 额外加一行格式提示,降低用户输入错误率
            message.Text += "\n示例格式:2024-05-20";
            return message;
        }
    }
}

关键细节说明:

  • ValidateInputAsync是核心:这个方法负责检查用户输入的有效性,用DateTime.TryParse判断输入是否能转成合法日期。有效就返回成功,无效就返回失败,父类会自动处理重试逻辑。
  • 构造函数复用父类逻辑:直接用父类的参数设置默认提示、重试文本和最多重试3次,不用重复造轮子。
  • 自定义提示(可选):重写MakePrompt可以给提示消息加额外信息,比如日期格式示例,用户更容易知道该怎么输入。

怎么用这个Prompt?

在你的对话流程里这样调用就行:

public async Task StartAsync(IDialogContext context)
{
    // 实例化自定义Prompt,也可以传入自定义的提示文本
    var datePrompt = new CustomPrompt(RetryCount: 3);
    // 调用Prompt,指定输入完成后的回调方法
    context.Call(datePrompt, AfterDateReceivedAsync);
}

private async Task AfterDateReceivedAsync(IDialogContext context, IAwaitable<string> result)
{
    try
    {
        // 获取用户输入的有效日期
        var validDate = await result;
        await context.PostAsync($"你输入的有效日期是:{validDate}");
    }
    catch (TooManyAttemptsException)
    {
        // 处理重试次数用完的情况
        await context.PostAsync("重试次数过多,对话结束啦。");
    }
    context.Done<object>(null);
}

这样一来,用户输入无效日期时,会自动弹出重试提示,最多试3次;输入正确日期就会进入后续处理逻辑,完美符合你的需求~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:11:54