繁体   English   中英

如何在OnTurnAsync-Method中处理来自AdaptiveCard的回发

[英]How do I handle Postback from AdaptiveCard in OnTurnAsync-Method

我正在编写一个使用自适应卡片ChoiceSet的机器人。 我试图让用户选择。 现在因为结果没有在聊天中显示,我必须检查OnTurnAsync ,如果我得到的消息是postback 我该怎么做呢? 这就是我试过的方法 - > if (dc.Context.Activity.GetType().GetProperty("ChannelData") != null) Null ReferenceException

从Botframework支持编辑:请不要使用下面的代码块。 它只适用于模拟器。 相反,使用:

if (string.IsNullOrWhiteSpace(activity.Text) && activity.Value != null)
{
    activity.Text = JsonConvert.SerializeObject(activity.Value);
}

我的OnTurnAsync-Method:

 
 
 
 
  
  
  public async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default(CancellationToken)) { DialogContext dc = null; switch (turnContext.Activity.Type) { case ActivityTypes.Message: if (dc.Context.Activity.GetType().GetProperty("ChannelData") != null) { var channelData = JObject.Parse(dc.Context.Activity.ChannelData.ToString()); if (channelData.ContainsKey("postback")) { var postbackActivit = dc.Context.Activity; postbackActivit.Text = postbackActivit.Value.ToString(); await dc.Context.SendActivityAsync(postbackActivit); } } await ProcessInputAsync(turnContext, cancellationToken); break;
 
 
  

这是因为你的行: DialogContext dc = null

它应该是: var dc = await Dialogs.CreateContextAsync(turnContext);

请注意, Dialogs可能需要替换为您使用DialogSet定义的DialogSet 有几种不同的方法可以做到这一点,但这是我用来测试你上一期的<myBot>.cs类的上半部分:

public class QuickTestBot_CSharpBot : IBot
    {
        private readonly IStatePropertyAccessor<DialogState> _dialogStateAccessor;
        private readonly ConversationState _conversationState;
        public QuickTestBot_CSharpBot(ConversationState conversationState)
        {
            _conversationState = conversationState ?? throw new ArgumentNullException(nameof(conversationState));
            _dialogStateAccessor = _conversationState.CreateProperty<DialogState>(nameof(DialogState));

            Dialogs = new DialogSet(_dialogStateAccessor);
            Dialogs.Add(new QuickDialog());

        }

        private DialogSet Dialogs { get; set; }

        public async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default(CancellationToken))
        {
            var activity = turnContext.Activity;

            var dc = await Dialogs.CreateContextAsync(turnContext);

            if (string.IsNullOrWhiteSpace(activity.Text))
            {
                activity.Text = JsonConvert.SerializeObject(activity.Value);
            }
    [...]

这里有几个很好的样本的链接也使用瀑布对话框,所以你可以看到他们如何设置他们的<bot>.cs类(注意他们没有从自适应卡片输入......这只是为了帮助你设置瀑布对话框和OnTurnAsync ):

  1. MultiTurnPromptsBot
  2. CardsBot
  3. BasicBot

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM