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();
}
}
Ожидаемое поведение
Когда пользователь выбирает Нет при подтверждении, должно отображаться поле формы, чтобы пользователи могли выбрать поле для изменения.
введите изображениеописание здесь