Как предотвратить несколько записей для PromptDialog.Number
Я использую метод PromptDialog.Number в классе диалогового окна платформы бота, как это:
PromptDialog.Number(context, ResumeAfterClarification, prompt, min:1, max:3, retry:retryText);
Это прекрасно работает по большей части. Если пользователь вводит число, которое не находится в диапазоне от 1 до 3, отображается retryText, и пользователь должен повторить попытку. Однако, если пользователь вводит числа, разделенные запятыми, это принимается (например, 1, 2, 3). Первый номер передается методу возобновления, все остальное игнорируется.
Как я могу предотвратить это? Было бы разумно, чтобы любая недопустимая запись (т. Е. Любая запись, которая не является единственным числом между min и max) должна быть отклонена.
Я что-то здесь упускаю? Может ли этот метод принимать несколько записей? Как они передаются, чтобы возобновить метод в одном параметре int64? Я действительно хочу отключить это.
1 ответ
Как отметил Дилан Николсон в комментариях, вы можете наследовать 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);
}