【问题标题】:Data validation before next dialog waterfall step in Bot FrameworkBot Framework 中下一个对话瀑布步骤之前的数据验证
【发布时间】:2017-08-19 12:27:26
【问题描述】:

有简单的瀑布对话框:

SendMessageDialog = [
    function (session) {
        builder.Prompts.time(session, "Enter dates?");
    },
    function (session, results) {
        session.conversationData.start = builder.EntityRecognizer.resolveTime([results.response]).toISOString();

        if(typeof results.response.resolution.end != "undefined")
            session.conversationData.end = results.response.resolution.end.toISOString();
    }
];

Bot 成功识别不同格式的时间,如果格式无效,则默认提示用户建议重新输入数据,例如:

我不明白。请从列表中选择一个选项。

Prompts 选项中,我只能更改此默认retryPrompt 消息。如果我需要额外的验证,例如:

  • 用户输入日期,但由于业务原因,日期无效 逻辑(过去,不可用)
  • 用户输入一个位置,因此需要检查可用位置列表(可能来自 api 调用)
  • 检查Prompts.number()之后的号码范围

是否有一种简单的方法可以添加额外的验证以重试相同的瀑布步骤并要求用户重新输入数据?如何实施? BotBuilder 3.9 是否有可行的代码?

存在some examples 可以使用 LUIS API 调用进行一些验证,但它们仅适用于下一个瀑布步骤。目标是在输入正确的数据之前不进行下一步 - 有可能吗?谢谢!

【问题讨论】:

    标签: node.js validation botframework


    【解决方案1】:

    刚问完问题,就找到了操作方法Create custom prompts to validate input

    结果代码:

    [
        function (session) {
            // Call start/end time prompt dialog
            session.beginDialog("DatePromptDialog");
        },
        ...
    ]
    
    DatePromptDialog = [
        function (session, args) {
            var options = { retryPrompt: "I didn’t recognize dates you entered. Please try again using format: start - end dates" };
    
            if (args && args.reprompt && args.endTimeMissed) {
                builder.Prompts.time(session, "Please specify both start - end times:", options);
            } else if (args && args.reprompt && args.dateInPast){
                builder.Prompts.time(session, "That date seems to be in the past! Please enter a valid date.", options);
            } else {
                builder.Prompts.time(session, "Enter dates?", options);
            }
        },
        function (session, results) {
            var args = {};
            delete session.conversationData.start;  // Clear previous values
            delete session.conversationData.end;
    
            // Get start time
            session.conversationData.start = builder.EntityRecognizer.resolveTime([results.response]).toISOString();
            // Get duration end time if available
            if(typeof results.response.resolution.end != "undefined")
                session.conversationData.end = results.response.resolution.end.toISOString();
            else {
                args.endTimeMissed = true;
                args.reprompt = true;
            }
    
            // Convert dates from string
            var currDate = new Date(); // Current date
            var startDate = new Date(session.conversationData.start);
            var endDate = new Date(session.conversationData.end);
    
            if(startDate < currDate || endDate < currDate) {
                args.dateInPast = true;
                args.reprompt = true;
            }
    
            if (args.reprompt) {
                // Repeat the dialog
                session.replaceDialog('DatePromptDialog', args);
            } else {
                // Success
                session.endDialog();
            }
        }
    ];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-18
      • 2020-02-26
      • 1970-01-01
      • 1970-01-01
      • 2019-03-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多