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

问题描述

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

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));
}

card.Buttons.Add(new CardAction(
        ActionTypes.PostBack,"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",};
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

}