Как предотвратить несколько записей для 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);
    }
Другие вопросы по тегам