如何防止PromptDialog.Number

时间:2017-12-07 07:47:41

标签: c# botframework azure-bot-service

我在机器人框架对话框类中使用PromptDialog.Number方法,如下所示:

PromptDialog.Number(context, ResumeAfterClarification, prompt, min:1, max:3, retry:retryText);

这在大多数情况下都可以正常工作。如果用户输入的数字不在1和3之间,则会显示retryText,并且用户必须重试。但是,如果用户输入用逗号分隔的数字,则接受该数字(例如,1,2,3)。第一个数字传递给resume方法,其他一切都被忽略。

我该怎样防止这种情况?有意义的是,任何无效的条目(即最小和最大之间不是单个数字的任何条目)都应该被拒绝。

我在这里遗漏了什么吗?这种方法可以接受多个条目吗?它们如何在单个int64参数中传递给resume方法?我真的想禁用它。

1 个答案:

答案 0 :(得分:1)

正如Dylan Nicholson在评论中所提到的,您可以继承PromptInt64并使用自定义的TryParse方法:

[Serializable]
public class CustomPromptInt64 : PromptInt64
{
    public CustomPromptInt64(string prompt, string retry, int attempts, long? min = null, long? max = null) 
            : base(prompt, retry, attempts, null, min, max)
    {
    }

    protected override bool TryParse(IMessageActivity message, out long result)
    {
        if(Int64.TryParse(message.Text, out result))
        {
            return (result >= this.Min && result <= this.Max);
        }
        return false;
    }
}

在对话框中使用CustomPromptInt64:

    public Task StartAsync(IDialogContext context)
    {
        context.Wait(MessageReceivedAsync);
        return Task.CompletedTask;
    }

   private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<object> result)
    {

        var child = new CustomPromptInt64("Number between 1 and 3", "Please try again", 3, min: 1, max: 3);
        context.Call<long>(child, ResumeAfterClarification);
    }

    private async Task ResumeAfterClarification(IDialogContext context, IAwaitable<long> result)
    {
        var number = await result;
        context.Done(true);
    }