Как использовать результат FormFlow в Microsoft BotFramework?

Я создаю простого бота с помощью Microsoft BotFramework и использую FormFlow. Так:

[Serializable]
public class Test
{
 public String Name {get;set;}
 public uint Age {get;set; }
}

internal static IDialog<Test> MakeRootDialog()
    {
        return Chain.From(() => FormDialog.FromForm(Test.BuildForm));
    }

А также:

 public async Task<Message> Post([FromBody]Message message)
    {
        if (message.Type == "Message")
        {         
         return await Conversation.SendAsync(message, MakeRootDialog);
        }
        else
        {
            return HandleSystemMessage(message);
        }
    }

Итак, Micrisoft BotEmulator работает хорошо (и бот) и спрашивает у меня Имя и Возраст Человека. Но как получить результат этого выбора, чтобы использовать его?

И как узнать, какой пользователь набирает его? Должен ли я использовать ConversationId?

P.S. я имею в виду, как я могу получить результат от имени пользователя и возраста пользователя? Я пытаюсь использовать:

 var name= result.GetBotPerUserInConversationData<Test>("Name");

Но он возвращает ноль;

P.P.S: я использую эмулятор бота: и получаю ответ json следующим образом:

GetBotPerUserInConversationData:DialogState { some binary data }

Итак, я использую

   var name= result.GetBotPerUserInConversationData<Test>("DialogState");

Но получить ошибку:

 "exceptionMessage": "Error converting value System.Byte[] to type 'Test'. Path ''.",
"exceptionType": "Newtonsoft.Json.JsonSerializationException"    

person Admiral Land    schedule 28.05.2016    source источник


Ответы (2)


Привет, поскольку вы создаете форму, вы можете получить результат в методе обратного вызова FormFlowComplete, как показано ниже.

private async Task yourFormFlowComplete(IDialogContext context, IAwaitable<yourclass> result)
    {
         var res = await result;//res will contain the result set, if you build the form with a class
    }
person Satheesh    schedule 21.07.2016

Вы можете просто «связать» вызов Do с функцией Chain.From.

internal static IDialog<Test> MakeRootDialog()
{
     return Chain.From(() => FormDialog.FromForm(Test.BuildForm))
                  .Do(async (context, formResult) =>
                  {
                        var completed = await formResult;
                        //your logic
                 }
}

'completed' будет иметь результат формы с записями от пользователя.

Вы можете обратиться к AnnotatedSandwichBot, где они делают именно то, что вы нужно здесь.

person Ezequiel Jadib    schedule 28.05.2016
comment
admiral-land помог ли вам мой ответ? - person Ezequiel Jadib; 02.06.2016