【问题标题】:Adaptive card(user input form) in BotFramework V4 nodejs gets reprompted after user submit用户提交后,BotFramework V4 nodejs中的自适应卡片(用户输入表单)被重新提示
【发布时间】:2020-05-07 04:36:22
【问题描述】:

async feed_first(stepContext) 
{
    let company_card = MessageFactory.attachment(
      CardFactory.adaptiveCard(testfeedback)
    );
    
    return await stepContext.prompt("textPrompt", {
      prompt: company_card
    });
}


async feed_second(stepContext) {
    console.log("enter feedback second");
    console.log(stepContext.context.activity.value);
}

{
  "type": "AdaptiveCard",
  "version": "1.0",
  "body": [
    {
      "type": "Container",
      "items": [
        {
          "type": "Input.ChoiceSet",
          "placeholder": "Placeholder text",
          "choices": [
            {
              "title": " 1",
              "value": " 1"
            },
            {
              "title": " 2",
              "value": " 2"
            }
          ],
          "style": "expanded",
          "id": "cho"
        },
        {
          "type": "ActionSet",
          "actions": [
            {
              "type": "Action.Submit",
              "title": "Submit"
            }
          ]
        }
      ]
    }
  ],
  "$schema": "http://adaptivecards.io/schemas/adaptive-card.json"
}

所以对于这段代码,卡会显示出来,但在机器人模拟器上,当点击提交按钮时,什么也没有发生。控制台显示“正在运行带有消息活动的对话框”并再次提示同一张卡。机器人不会流到瀑布对话框的第二步(feed_second)。我想要代码做的是在控制台上显示“第二个输入反馈”,然后在控制台上显示带有 id“cho”的 stepContext.context.activity.value agiain 的选定选项。旁注 - 我在声明 WaterfallDialog 时添加了“feed_first”和“feed_second”,所以这不是问题

【问题讨论】:

  • 您能否更详细地描述实际和预期的行为?您是说系统提示您,但是当您输入文本时它会重新提示?还是根本不让您响应提示?您能否分享您的机器人的更大上下文以及如何调用此对话框?
  • (如果你想让我看到你的回复,你需要@提及我。)就像比尔说的那样,你没有提供足够的信息来回答你的问题。但是,看起来您可能会从提交操作中获取基于值的消息活动,这意味着活动的文本将为空,因此无法满足文本提示。如果是这种情况,您可以在调用continueDialog 之前将值序列化到文本属性中。如果您提供您正在使用的自适应卡,将会有所帮助。 stackoverflow.com/help/how-to-ask
  • @billoverton。嗨,我已经添加了卡片并解释了我希望它如何工作。提前致谢。
  • @KyleDelaney。嗨,我已经添加了卡片并解释了我希望代码如何工作。提前致谢
  • 我的回答可以接受吗?

标签: javascript node.js botframework adaptive-cards


【解决方案1】:

如果您想使用带有文本提示的自适应卡片输入,您将需要访问活动的值并以某种方式将其序列化为活动的文本,如this example 所示。此信息位于my Adaptive Cards blog post 的对话框部分,您应该阅读。

在 JavaScript 中,您可以将值序列化为如下文本:

/**
 *
 * @param {TurnContext} turnContext
 */
async sendValueToDialogAsync(turnContext)
{
    // Serialize value
    var json = JSON.stringify(turnContext.activity.value);
    // Assign the serialized value to the turn context's activity
    turnContext.activity.text = json;
    // Create a dialog context
    var dc = await this.dialogs.createContext(turnContext);
    // Continue the dialog with the modified activity
    await dc.continueDialog();
}

在您的情况下,如果您只需要一个输入的结果,那么您可以只使用该属性而不是序列化任何内容:

turnContext.activity.text = turnContext.activity.value.cho;

【讨论】:

  • 我的问题不在于数据提取。它是我的对话流程没有流到下一步。在我的情况下是“feed_second”或在你的情况下是“sendValueToDialogAsync”。单击提交按钮时,我希望它进入下一步,而不是再次提示同一张卡
  • @NitinDharmapal - 因为活动的 text 属性为空,所以不会进入下一步。您需要像我解释的那样填充活动的文本属性。
猜你喜欢
  • 2022-01-24
  • 2020-12-09
  • 2020-03-29
  • 2020-12-31
  • 2020-02-21
  • 1970-01-01
  • 2019-06-14
  • 1970-01-01
  • 2019-07-18
相关资源
最近更新 更多