Bot Framework V4 选择提示与英雄卡 c#

Bot Framework V4 Choice Prompt with Hero Card c#

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

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 并删除指定的英雄卡,则选择只允许显示给用户的文本。

您可以将样式 属性 放入 PromptOptions

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

在 BotBuilderv4 中,ChoicePrompt 需要 PromptOptions

中的 IList<Choice>
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

}