Как предотвратить несколько записей для PromptDialog.Number

Я использую метод PromptDialog.Number в диалоговом классе фреймворка бота, например:

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

Это отлично работает по большей части. Если пользователь вводит число, которое не находится между 1 и 3, отображается retryText, и пользователь должен повторить попытку. Однако, если пользователь вводит числа, разделенные запятыми, это принимается (например, 1, 2, 3). В метод возобновления передается первое число, все остальное игнорируется.

Как я могу предотвратить это? Было бы разумно, чтобы любая недействительная запись (т. е. любая запись, которая не является одним числом между min и max) должна быть отклонена.

Я что-то упустил здесь? Может ли этот метод принимать несколько записей? Как они передаются в метод возобновления в одном параметре int64? Я действительно хочу отключить это.


person under    schedule 07.12.2017    source источник
comment
Вы пытались создать свой собственный диалог PromptInt64 с параметрами, где вы переопределяете PromptRecognizer (и, в частности, RecognizeNumber)? Весь исходный код этой библиотеки доступен на github, так что разобраться не составит труда.   -  person Dylan Nicholson    schedule 07.12.2017
comment
Нет, не пробовал (пока). Все еще пытаюсь использовать его как есть без настройки. Мне нужно довольно ванильное, мне просто нужно, чтобы пользователь ввел действительный номер. Не уверен, что я использую его неправильно или это ошибка?   -  person under    schedule 07.12.2017
comment
Это может быть даже возможно, если вы предоставите свой собственный локализованный ресурс NumberExpression. В настоящее время это регулярное выражение, которое будет соответствовать любому месту в поле, которое оказывается числом. Если вы хотите изменить его так, чтобы все выражение было числовым, оно должно быть чем-то вроде ^[+-]?\d*\.?\d+$ (не проверено и не будет работать, если вы введете, например, только 1. )   -  person Dylan Nicholson    schedule 07.12.2017


Ответы (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);
    }
person Eric Dahlvang    schedule 07.12.2017