我在机器人框架对话框类中使用PromptDialog.Number方法,如下所示:
PromptDialog.Number(context, ResumeAfterClarification, prompt, min:1, max:3, retry:retryText);
这在大多数情况下都可以正常工作。如果用户输入的数字不在1和3之间,则会显示retryText,并且用户必须重试。但是,如果用户输入用逗号分隔的数字,则接受该数字(例如,1,2,3)。第一个数字传递给resume方法,其他一切都被忽略。
我该怎样防止这种情况?有意义的是,任何无效的条目(即最小和最大之间不是单个数字的任何条目)都应该被拒绝。
我在这里遗漏了什么吗?这种方法可以接受多个条目吗?它们如何在单个int64参数中传递给resume方法?我真的想禁用它。
答案 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);
}