Как мне обработать обратную передачу от AdaptiveCard в OnTurnAsync-Method
Я программирую бота, который использует адаптивные карты ChoiceSet. Я пытаюсь получить выбор пользователей. Теперь, поскольку результат не отображается в чате, я должен проверить в OnTurnAsync
-Метод, если полученное сообщение postback
, Как мне это сделать? Вот как я пытался -> Null ReferenceException в if (dc.Context.Activity.GetType().GetProperty("ChannelData") != null)
Мой OnTurnAsync-метод:
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;
1 ответ
Это из-за вашей линии: DialogContext dc = null
,
Так должно быть: var dc = await Dialogs.CreateContextAsync(turnContext);
Обратите внимание, что Dialogs
может потребоваться заменить на то, что вы определили 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 (activity.Type == ActivityTypes.Message)
{
// Ensure that message is a postBack (like a submission from Adaptive Cards
var channelData = JObject.Parse(dc.Context.Activity.ChannelData.ToString());
if (channelData.ContainsKey("postback"))
{
var postbackActivity = dc.Context.Activity;
// Convert the user's Adaptive Card input into the input of a Text Prompt
// Must be sent as a string
postbackActivity.Text = postbackActivity.Value.ToString();
await dc.Context.SendActivityAsync(postbackActivity);
}
}
...
Вот несколько ссылок на несколько хороших примеров, которые также используют диалоги водопада, так что вы можете увидеть, как они настраивают свои <bot>.cs
класс (обратите внимание, что они не получают вход от адаптивных карт... это просто, чтобы помочь вам настроить диалог водопад и OnTurnAsync
):