KeyNotFoundException при подтверждении запроса в динамическом FormFlow - PullRequest
0 голосов
/ 18 сентября 2018

SDK Версия: 3.16.1.38846 Код: .Net

Описание проблемы

Мы используем Field.SetDefine для определения кнопок поля в реальном времени на основе значения, полученного от вызова службы.Если быть точным, у нас есть поле Источник и поле Назначение , кнопки для поля Назначение и Источник определяются на основе результата от услуг. Когда пользователь заполняет форму,но нажимает Нет в запросе подтверждения, он получает следующее исключение:

Невозможность заполнить форму.Исключение: Указанный ключ отсутствует в словаре.

   at System.Collections.Generic.Dictionary`2.get_Item(TKey key)
   at Microsoft.Bot.Builder.FormFlow.Advanced.Field`1.ValueDescription(Object value)
   at Microsoft.Bot.Builder.FormFlow.Advanced.RecognizeEnumeration`1.<>c__DisplayClass2_0.<.ctor>b__0(Object value)
   at Microsoft.Bot.Builder.FormFlow.Advanced.RecognizeEnumeration`1.ValueDescription(Object value)
   at Microsoft.Bot.Builder.FormFlow.Advanced.Prompter`1.ValueDescription(IField`1 field, Object value, String format)
   at Microsoft.Bot.Builder.FormFlow.Advanced.Prompter`1.ExpandTemplate(String template, String currentChoice, String noValue, T state, IField`1 field, Object[] args, IList`1& buttons)
   at Microsoft.Bot.Builder.FormFlow.Advanced.Prompter`1.Prompt(T state, IField`1 field, Object[] args)
   at Microsoft.Bot.Builder.FormFlow.Advanced.NavigationField`1..ctor(String name, String startField, IForm`1 form, T state, FormState formState, Fields`1 fields)
   at Microsoft.Bot.Builder.FormFlow.Advanced.NavigationStep`1..ctor(String startField, IForm`1 form, T state, FormState formState)
   at Microsoft.Bot.Builder.FormFlow.FormDialog`1.<MessageReceived>d__16.MoveNext()
   --- End of inner exception stack trace ---

Мы думаем, что это, вероятно, происходит потому, что код FormFlow пытается получить доступ к значению поля, но к списку кнопокизменилось, и теперь это значение больше не существует в списке.

Как мне избежать этого исключения.

Пример кода

Полный код бота, который воспроизводит проблему.

public class DynaForm
{
    public static ICollection<string> CustomerAccounts { get; set; }
    public string Destination { get; set; }
    public string source { get; set; }


    public static IForm<DynaForm> BuildFormAsync()
    {
        return new FormBuilder<DynaForm>()
            .Message("Welcome to the simple sandwich order bot!")
            .Field(new FieldReflector<DynaForm>(nameof(source))
                .SetType(null)
                .SetDefine((state, field) =>
                {
                foreach (var item in CustomerAccounts)
               {
                   field
                       .AddDescription(item,item)
                       .AddTerms(item, item);
               }
               return Task.FromResult(true);                   
                })             
                .SetPrompt(new PromptAttribute("Select the source account \n {||} \n") { ChoiceStyle = ChoiceStyleOptions.Buttons })
                .SetAllowsMultiple(false)
                )                  
            .Field(new FieldReflector<DynaForm>(nameof(Destination))
                .SetType(null)
                .SetDependencies(nameof(source))
                .SetDefine((state, field) =>
                {
                foreach (var item in CustomerAccounts)
                {
                  field
                    .AddDescription(item, item)
                    .AddTerms(item, item);
                }
                return Task.FromResult(true);
                })
                .SetPrompt(new PromptAttribute("Select the destination account \n {||} \n") { ChoiceStyle = ChoiceStyleOptions.Buttons })                 
                .SetAllowsMultiple(false)                 
                )
            .Confirm("Do you want to continue? {||}")           
            .Build();   
    }
}

Ожидаемое поведение

Когда пользователь выбирает Нет при подтверждении, должно отображаться поле формы, чтобы пользователи могли выбрать поле для изменения.

введите изображениеописание здесь

1 Ответ

0 голосов
/ 20 сентября 2018

Я ответил вам через GitHub, так как похоже, что у вас один и тот же вопрос опубликован дважды: https://github.com/Microsoft/BotBuilder/issues/5060

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...