Botframework v4:Stepcontext 选项

2024-01-15

您好,有人可以解释一下如何使用瀑布stepcontext.Option吗? 我一直在示例中看到它,但我不太明白如何使用它。 以下是来自的示例 and .

我计划重构我的整个代码,并且如果可能的话希望使用此选项。感谢!

private static async Task<DialogTurnResult> TableStepAsync(
    WaterfallStepContext step,
    CancellationToken cancellationToken = default(CancellationToken))
{
    string greeting = step.Options is GuestInfo guest
            && !string.IsNullOrWhiteSpace(guest?.Name)
            ? $"Welcome {guest.Name}" : "Welcome";

    string prompt = $"{greeting}, How many diners will be at your table?";
    string[] choices = new string[] { "1", "2", "3", "4", "5", "6" };
    return await step.PromptAsync(
        TablePrompt,
        new PromptOptions
        {
            Prompt = MessageFactory.Text(prompt),
            Choices = ChoiceFactory.ToChoices(choices),
        },
        cancellationToken);
}

and

    private async Task<DialogTurnResult> SelectionStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
{
    // Continue using the same selection list, if any, from the previous iteration of this dialog.
    List<string> list = stepContext.Options as List<string> ?? new List<string>();
    stepContext.Values[CompaniesSelected] = list;

    // Create a prompt message.
    string message;
    if (list.Count is 0)
    {
        message = $"Please choose a company to review, or `{DoneOption}` to finish.";
    }
    else
    {
        message = $"You have selected **{list[0]}**. You can review an additional company, " +
            $"or choose `{DoneOption}` to finish.";
    }

    // Create the list of options to choose from.
    List<string> options = _companyOptions.ToList();
    options.Add(DoneOption);
    if (list.Count > 0)
    {
        options.Remove(list[0]);
    }

    // Prompt the user for a choice.
    return await stepContext.PromptAsync(
        SelectionPrompt,
        new PromptOptions
        {
            Prompt = MessageFactory.Text(message),
            RetryPrompt = MessageFactory.Text("Please choose an option from the list."),
            Choices = ChoiceFactory.ToChoices(options),
        },
        cancellationToken);
}

如果可能的话,我还想学习如何在本示例中像这样传递和获取值

    private static async Task<DialogTurnResult> RoomStepAsync(
    WaterfallStepContext step,
    CancellationToken cancellationToken = default(CancellationToken))
{
    // Save the name and prompt for the room number.
    string name = step.Result as string;
    ((GuestInfo)step.Values[GuestKey]).Name = name;
    return await step.PromptAsync(
        TextPrompt,
        new PromptOptions
        {
            Prompt = MessageFactory.Text($"Hi {name}. What room will you be staying in?"),
        },
        cancellationToken);
}

private static async Task<DialogTurnResult> FinalStepAsync(
    WaterfallStepContext step,
    CancellationToken cancellationToken = default(CancellationToken))
{
    // Save the room number and "sign off".
    string room = step.Result as string;
    ((GuestInfo)step.Values[GuestKey]).Room = room;

    await step.Context.SendActivityAsync(
        "Great, enjoy your stay!",
        cancellationToken: cancellationToken);

    // End the dialog, returning the guest info.
    return await step.EndDialogAsync(
        (GuestInfo)step.Values[GuestKey],
        cancellationToken);
}

}

现在这就是我保存值的方式。

var userstate = await (stepContext.Context.TurnState["BasicAccessors"] as BasicAccessors).BasicUserStateAccessor.GetAsync(stepContext.Context);
userstate.Name = value;

你到底想做什么? stepContext.Options 是一个可以在使用 BeginDialog 或 ReplaceDialog 调用 Dialog 时发送的对象。 例如:

await BeginDialogAsync(dialogId, sendobject, cancellationToken)

stepContext.Options是您通过调用的对话框接收该对象的方式。

例如,在第一个文档中,主对话框正在调用每个子对话框并向它们发送 userInfo.Guest 对象:

return await stepContext.BeginDialogAsync(TableDialogId, userInfo.Guest, cancellationToken);

被调用的对话框正在接收它并将其转换为字符串作为验证:

string greeting = step.Options is GuestInfo guest
            && !string.IsNullOrWhiteSpace(guest?.Name)
            ? $"Welcome {guest.Name}" : "Welcome";

您可以去掉验证,它看起来像这样,记住这只有在发送的对象(userInfo.Guest)不为空并且可以转换为字符串时才有效:

string greeting = (string)step.Options;

请记住: 步骤Context.Options;是一个对象,需要转换为正确的类型。 如果您不添加空/类型验证,则转换可能会失败并且您的机器人可能会崩溃。 这是框架的一项功能,但机器人不需要工作,您可以使用其他方式通过方法或类发送对象。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Botframework v4:Stepcontext 选项 的相关文章

  • 删除文件的最后 10 个字符

    我想删除文件的最后 10 个字符 说一个字符串 hello i am a c learner 是文件内的数据 我只是希望该文件是 hello i am a 文件的最后 10 个字符 即字符串 c learner 应在文件内消除 解决方案 将
  • 根据属性的类型使用文本框或复选框

    如果我有这样的结构 public class Parent public string Name get set public List
  • std::vector 与 std::stack

    有什么区别std vector and std stack 显然 向量可以删除集合中的项目 尽管比列表慢得多 而堆栈被构建为仅后进先出的集合 然而 堆栈对于最终物品操作是否更快 它是链表还是动态重新分配的数组 我找不到关于堆栈的太多信息 但
  • 如何在 C# 中打开 Internet Explorer 属性窗口

    我正在开发一个 Windows 应用程序 我必须向用户提供一种通过打开 IE 设置窗口来更改代理设置的方法 Google Chrome 使用相同的方法 当您尝试更改 Chrome 中的代理设置时 它将打开 Internet Explorer
  • 传递给函数时多维数组的指针类型是什么? [复制]

    这个问题在这里已经有答案了 我在大学课堂上学习了 C 语言和指针 除了多维数组和指针之间的相似性之外 我认为我已经很好地掌握了这个概念 我认为由于所有数组 甚至多维 都存储在连续内存中 因此您可以安全地将其转换为int 假设给定的数组是in
  • -webkit-box-shadow 与 QtWebKit 模糊?

    当时有什么方法可以实现 webkit box shadow 的工作模糊吗 看完这篇评论错误报告 https bugs webkit org show bug cgi id 23291 我认识到这仍然是一个问题 尽管错误报告被标记为RESOL
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半
  • 在 Unity 中实现 Fur with Shells 技术

    我正在尝试在 Unity 中实现皮毛贝壳技术 http developer download nvidia com SDK 10 5 direct3d Source Fur doc FurShellsAndFins pdf Fins 技术被
  • 如何定义一个可结构化绑定的对象的概念?

    我想定义一个concept可以检测类型是否T can be 结构化绑定 or not template
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • 为什么 isnormal() 说一个值是正常的,而实际上不是?

    include
  • 如何在 Linq to SQL 中使用distinct 和 group by

    我正在尝试将以下 sql 转换为 Linq 2 SQL select groupId count distinct userId from processroundissueinstance group by groupId 这是我的代码
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • C++ 继承的内存布局

    如果我有两个类 一个类继承另一个类 并且子类仅包含函数 那么这两个类的内存布局是否相同 e g class Base int a b c class Derived public Base only functions 我读过编译器无法对数
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi
  • DotNetZip:如何提取文件,但忽略zip文件中的路径?

    尝试将文件提取到给定文件夹 忽略 zip 文件中的路径 但似乎没有办法 考虑到其中实现的所有其他好东西 这似乎是一个相当基本的要求 我缺少什么 代码是 using Ionic Zip ZipFile zf Ionic Zip ZipFile
  • 类型或命名空间“MyNamespace”不存在等

    我有通常的类型或命名空间名称不存在错误 除了我引用了程序集 using 语句没有显示为不正确 并且我引用的类是公共的 事实上 我在不同的解决方案中引用并使用相同的程序集来执行相同的操作 并且效果很好 顺便说一句 这是VS2010 有人有什么
  • Mono 应用程序在非阻塞套接字发送时冻结

    我在 debian 9 上的 mono 下运行一个服务器应用程序 大约有 1000 2000 个客户端连接 并且应用程序经常冻结 CPU 使用率达到 100 我执行 kill QUIT pid 来获取线程堆栈转储 但它总是卡在这个位置

随机推荐

  • 如何在 SwiftUI 中使列表反转

    我是 SwiftUI 的新手 正在尝试制作类似的东西reverse在安卓中LinearLayoutManager messagesRecyclerView view findViewById R id messagesRecyclerVie
  • 如何确定 QTextDocument 的高度?

    给定一个特定的宽度 我想找出一个的高度QTextDocument 换句话说 如果QTextEdit其中包含QTextDocument is w宽 最小高度是多少h为了完全显示文档而不需要滚动条 将 QTextDocument 对象的宽度设置
  • log4net - 想要为每个Web应用程序用户创建一个日志文件[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我们在 Asp Net Web 应用程序中使用 log4net 替换 nLog nLog 有一个有用的功能 允许我们为每个用户创建一个
  • 定位上下文菜单

    我正在尝试使用 jQuery 定位自定义上下文菜单 第一次它出现在正确的位置 鼠标坐标 但随后当前位置与新位置相加 以便菜单从屏幕上消失 这是 JavaScript
  • Div 100% 高度,内嵌显示

    我需要有 2 列divs 右栏将有一个随机内容 可能有 1 行或 100 行 我想在没有 JavaScript 的情况下跟随右列的高度 我正在尝试这个 div div style display inline block width 30
  • 为 python 2.7 安装 scipy

    我似乎无法让 SciPy 在 32 位 Windows XP 平台上为 Python 2 7 工作 我宁愿不构建自己的副本 有谁知道我在哪里可以找到它的安装程序 我试过这个site http www lfd uci edu gohlke p
  • 方括号在 SQL 查询中有效吗?

    我正在看某人写给我的一张便条 它看起来像这样 SELECT Something FROM Foobar WHERE blah blah pulls this too SELECT Something FROM Foobar WHERE so
  • 如何确定时钟的秒针是否位于较大区域或较小区域[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我得到的时间格式如下 hh mm ss 我必须找出在给定的时间内 秒针是否位于时针和分针形成的较大或较小的区域中 我知道
  • 如何从 C 中的浮点数中提取有偏差的指数?

    我在从浮点数中查找有偏差的指数时遇到问题 我不明白为什么我为参数输入的任何数字都返回 0 这是我的代码 iFloat t floatGetExp iFloat t x return x gt gt 23 0x7f800000 浮点数的指数是
  • numpy einsum() 可以执行外加法吗?

    在numpy中 我们可以在两个向量之间执行 外加法 a and b像这样 a np c 1 2 3 b np c 4 5 6 result a b T alternatively this can be a T b 是否可以使用einsum
  • 如何使用预处理器指令区分编译器的版本

    有没有办法区分使用预处理器指令的编译器版本 我在使用新的 Roslyn 编译器时遇到了问题 它生成的代码与旧编译器不同 我需要保持代码与使用 Visual Studio 2013 和 2015 的团队兼容 None
  • 从角度工厂中的 $resource 响应获取数据

    我有这个工厂 factory Member function resource var endpoint http some valid url function generateMemberToken id1 id2 return res
  • 有没有一种简单的方法可以在文本框中进行单击并拖动滚动?

    我有一个 divoverflow auto和滚动条 我希望能够拖动内容进行滚动 我不需要能够选择文本 是否有捷径可寻 一个 jQuery 插件会很好 否则普通的 JavaScript 就可以了 看来我自己说得还不够清楚 有一个具有固定高度的
  • 检查 API 是否受到监控(挂钩?)

    我的应用程序使用一些 API 例如GetProcAddress and CreateProcess这有时会导致防病毒软件将其标记为恶意软件 即使它不是恶意软件 我想做的是检查特定的 API 是否正在被监视或挂钩 如果是 那么我不会调用该部分
  • 远程登录亚马逊(KDP)

    我想自动化 KDP Kindle 桌面出版 的摘要 由于他们似乎没有任何电子邮件通知系统 至少我不知道 我需要通过curl 登录 但这让我发疯 我在用着简单的htmldom http simplehtmldom sourceforge ne
  • 从 .fits 文件构造 pandas 数据框

    我有一个包含数据的 fits 文件 我想从这个特定文件构建一个 pandas 数据框 但我不知道该怎么做 data fits open datafile data info gives No Name Type Cards Dimensio
  • 使用 h5py 压缩现有文件

    我目前正在开展一个有关 HDF5 数据集压缩的项目 最近开始使用 h5py 我遵循了基本教程 并且能够在创建文件时打开 创建和压缩文件 然而 在压缩现有文件时我一直不成功 这是我工作的目的 我尝试使用 r 打开文件 然后压缩分块数据集 但文
  • 使用 Atmosphere 仅向一位客户端广播

    如何使用 Atmosphere Meteor 将消息从一个客户端广播到另一个客户端 我目前有一个基于 Meteor 教程的实现 Override public void doGet HttpServletRequest req HttpSe
  • 允许进程自动继续的消息框

    我希望显示一个消息框 并且程序继续运行 而不是等待我在此消息框中单击 确定 能做到吗 else Debug or messagebox the line that fails MessageBox Show Cols columns Len
  • Botframework v4:Stepcontext 选项

    您好 有人可以解释一下如何使用瀑布stepcontext Option吗 我一直在示例中看到它 但我不太明白如何使用它 以下是来自的示例 and 我计划重构我的整个代码 并且如果可能的话希望使用此选项 感谢 private static a