首页 > 解决方案 > 带有英雄卡 c# 的 Bot Framework V4 选择提示

问题描述

我们曾经可以在如下对话框中使用英雄卡的选择提示作为提示,但由于某种原因,这已停止工作。该卡仍然正确显示,但是当您选择一个选项时,提示会一遍又一遍地重试。

var card = new HeroCard
{

    Text = "Please choose an option.",
    Buttons = new List<CardAction>()
};

foreach (var cl in input.ComplexList)
{
    string objString = JsonConvert.SerializeObject(cl.complexObject);
    card.Buttons.Add(new CardAction(
        ActionTypes.PostBack,
        cl.Name,
        null,
        objString,
        objString,
        objString));
}

card.Buttons.Add(new CardAction(
        ActionTypes.PostBack,
        "Cancel",
        null,
        "Cancel",
        "Cancel",
        "Cancel"));

var promptOptions = new PromptOptions
    {
        Prompt = (Activity)MessageFactory.Attachment(card.ToAttachment())                        
    };
            
return await stepContext.PromptAsync(nameof(ChoicePrompt), promptOptions, cancellationToken);

我看到我们现在可以定义提示的样式 AddDialog(new ChoicePrompt(nameof(ChoicePrompt)) { Style = ListStyle.HeroCard });

现在我的问题是我使用英雄卡在按钮值中隐藏了一些额外信息,以便在瀑布对话框的下一步中使用,这不再是一个选项,还是我错过了什么?

如果我将选择提示样式设置为 HeroCard 并删除指定的英雄卡,那么选择只允许向用户显示的文本。

标签: c#.net-corebotframeworkazure-bot-service

解决方案


您可以将样式属性放在 PromptOptions

var promptOptions = new PromptOptions {
  Prompt = (Activity) MessageFactory.Attachment(card.ToAttachment()),
  Style = ListStyle.HeroCard
};

在 BotBuilderv4 中,ChoicePrompt 需要IList<Choice>在 PromptOptions

using Microsoft.Bot.Builder.Dialogs.Choices;

var choices = new List<Choice> () {
  new Choice() {
    Value = "Value1",
    // Synonyms
    Synonyms = new string[] {};
  },
  new Choice() {
    Value = "Value2",
    Synonyms = new string[] {};
  },
  new Choice() {
    Value = "Value3",
    Synonyms = new string[] {};
  },
};
var promptOptions = new PromptOptions() {
  Prompt = (Activity) reply,
  RetryPrompt = (Activity) retry,
  Choices = choices,
  /* ^^^^^^^^^^^^^^^^^^ */
  Style = ListStyle.HeroCard,

};
return await stepContext.PromptAsync(nameof(ChoicePrompt), promptOptions, cancellationToken);

其中Choice.Value 是您放入 CardAction 的值value

new CardAction(ActionTypes.PostBack,title : "Cancel", value : "Cancel");

在下一步中,您可以获得用户的选择

private async Task<DialogTurnResult> NextStep(WaterfallStepContext stepContext, CancellationToken cancellationToken) {

  var result = (FoundChoice) stepContext.Result;
  // you can parse it as an enum or use it as is
  string UserChoice = result.Value
  // your logic here

}

推荐阅读