首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态KeyNotFoundException中确认提示的FormFlow

动态KeyNotFoundException中确认提示的FormFlow
EN

Stack Overflow用户
提问于 2018-09-18 09:53:48
回答 1查看 85关注 0票数 0

SDK版本: 3.16.1.38846代码:.Net

问题描述

我们使用Field.SetDefine根据调用服务的值在实时字段中定义按钮。具体来说,我们有一个 Source 字段和目的字段,当用户完成表单时,根据服务的结果定义目标和源字段的按钮,但是在确认提示中单击No,他会得到以下异常:

未能填写表格。例外情况:给定的密钥在字典.中不存在

代码语言:javascript
复制
   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代码试图访问字段的值,但是按钮列表发生了更改,现在列表中不再存在此值。

我怎样才能避免这个例外。

示例代码

复制问题的完整bot代码。

代码语言:javascript
复制
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();   
    }
}

预期行为

当用户在“确认提示”中选择“否”时,应显示表单字段,供用户选择要更改的字段。

在这里输入图像描述

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-20 00:05:33

我通过GitHub回复了你,因为看起来你有两次相同的问题:https://github.com/Microsoft/BotBuilder/issues/5060

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52383852

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档