【问题标题】:PromptDialog Choice with List object Bot FrameworkPromptDialog Choice 与 List 对象 Bot Framework
【发布时间】:2017-03-06 09:08:53
【问题描述】:

我正在创建一个 PromptDialog Choice 来填充我存储在数据库中的对象选项列表。但是,它只显示对象的类型而不是选项的名称。谁能建议我从数据库加载选项并将其与 PromptDialog 绑定的最佳方法? 这是我尝试过的:

    private void ShowOptions(IDialogContext context)
    {
        List<Option> ListOptions = Option.CreateListOption();
        PromptDialog.Choice(context, this.OnOptionSelected, ListOptions, "Are you looking for a flight or a hotel?", "Not a valid option", 3);
    }

    private async Task OnOptionSelected(IDialogContext context, IAwaitable<Option> result)
    {
        try
        {
            Option optionSelected = await result;

            switch (optionSelected.Text)
            {
                case "A":
                    context.Call(new RootDialog(), this.ResumeAfterChoose);
                    break;
                default: { context.Wait(MessageReceiveAsync); break; }
            }
        }
        catch (TooManyAttemptsException ex)
        {
            await context.PostAsync($"Ooops! Too many attemps :(. But don't worry, I'm handling that exception and you can try again!");

            context.Wait(this.MessageReceiveAsync);
        }
    }

这是我的选项对象:

[Serializable]
public class Option
{
    public int ID { get; set; }
    public string Text { get; set; }

    public Option()
    {
        ID = 0;
        Text = "";
    }

    public static List<Option> CreateListOption()
    {
        List<Option> list = new List<Option>();
        Option A = new Option();
        A.ID = 1;
        A.Text = "A";
        Option B = new Option();
        B.ID = 2;
        B.Text = "B";
        list.Add(A);
        list.Add(B);
        return list;
    }
}

这是我得到的结果:

【问题讨论】:

  • 您是否尝试过 Khushi4.net 在此线程中建议的内容:stackoverflow.com/questions/38072037/…
  • 我已经阅读了您之前提到的链接,但我的情况是我的列表是对象列表。它不是字符串列表或任何原始数据类型。
  • 知道了,编辑帮了大忙。您是否简单地尝试过覆盖 Option 对象的 ToString()?
  • 哇,瞧!那工作完美。非常感谢你。你拯救了我的想法。但它怎么能起作用呢?你能解释一下吗?
  • @Malte 您能否创建一个答案以清楚地显示解决方案,以便在每个人都像我一样处理它时为他们提供帮助?

标签: c# asp.net .net asp.net-web-api botframework


【解决方案1】:

重写 Option 对象的 ToString() 方法可以解决这个问题。

如果您不提供 PromptStyle 作为参数,Microsoft botframework 默认使用 PromptStyle.Auto 打印选项。因此,botframework 根据频道选择样式。对于模拟器,它似乎是文本,因此它尝试将选项打印为字符串。

【讨论】:

  • 非常感谢。似乎当我们重写 ToString() 方法时,UI 会自动使用它来渲染我们想要显示的文本!
  • 我面临同样的问题..但我无法解决它,您能否为解决方案提供示例代码,这将有很大帮助..thanx
  • 你是如何重写 ToString() 方法的?
【解决方案2】:

您可以通过重写 ToString() 方法来完成您的任务。当 PromptChoice 类试图从创建的自定义类中丢弃文本选项时,它默认调用 ToString() 方法来获取列表并在 Bot Activity 中呈现。

public class Option
{
    public int ID { get; set; }
    public string Text { get; set; }
    public Option()
    {
        ID = 0;
        Text = "";
    }
    public static List<Option> CreateListOption()
    {
        List<Option> list = new List<Option>();
        Option A = new Option();
        A.ID = 1;
        A.Text = "A";
        Option B = new Option();
        B.ID = 2;
        B.Text = "B";
        list.Add(A);
        list.Add(B);
        return list;
    }

    public override string ToString()
    {
        return Text;
    }
}

【讨论】:

  • 一些简短的解释会很好地说明您在代码中所做的更改以及它解决问题的原因。
  • 我刚刚展示了如何按照上面的要求将覆盖写入 ToString。因此,当 PromtChoice 尝试从创建的自定义类中丢弃文本选项时,它默认调用 ToString 以将文本获取到选项...
猜你喜欢
  • 2018-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-26
  • 1970-01-01
  • 2019-07-27
  • 1970-01-01
  • 2019-08-08
相关资源
最近更新 更多