我正在與來自Microsoft的Bot Builder和LUIS一起玩耍,我對於非常基本的東西有些困難。調用FormDialog並立即啓動
我有簡單的方法來響應LUIS意圖,其中一個我想調用FormDialog(所以基於一個非常簡單的模型),就是這樣。當意圖被識別時,我正確地輸入了正確的方法,並且我也看到我的模型的BuildForm方法被調用,但是然後bot不會通過這些字段來詢問用戶的值。
這裏是我的意圖方法的代碼(代碼沒有做太多,它沒有真正的章節目標尚未):
[LuisIntent("SendMessage")]
public async Task SendMessage(IDialogContext context, LuisResult result)
{
// Check if the user has already configured its message box
bool isBoxConfigured = false;
context.UserData.TryGetValue<bool>(Constants.UserData.IsBoxConfigured, out isBoxConfigured);
if (!isBoxConfigured)
{
// Configure box
context.Call(new FormDialog<MessageBox>(new MessageBox(), this._configureMessageBox, FormOptions.PromptInStart), async (c, r) =>
{
await c.PostAsync("Message Box configurée !");
});
}
else
{
// Send message
await context.PostAsync("Votre Message Box est déjà configurée. Le message a été envoyé !");
}
context.Wait(MessageReceived);
}
這裏的建設者和我LUIS對話框類的_configureMessageBox
屬性:
public readonly BuildFormDelegate<MessageBox> _configureMessageBox;
public LUISDialog(BuildFormDelegate<MessageBox> configureMessageBox)
{
_configureMessageBox = configureMessageBox;
}
這裏是我的模型(表格):
[Serializable]
public class MessageBox
{
[Describe("numéro d'identification")]
[Prompt("Quel est le {&} de votre Message Box ?")]
public int Id { get; set; }
[Describe("surnom")]
[Prompt("Quel {&} voulez-vous lui donner ?")]
public string BoxName { get; set; }
public static IForm<MessageBox> BuildForm()
{
return new FormBuilder<MessageBox>()
.Message("Mmmh... Je ne connais pas votre Message Box. J'ai besoin de quelques informations.")
.Build();
}
}
當我送向機器人發送消息「envoie un message」,它識別SendMessage
意圖,但立即迴應「消息框配置!」,該消息應該在之後發送,用戶瀏覽表單。
有沒有人有關於我應該怎麼做的想法?
謝謝:)
請出示您的形式,而且在context.Wait(的messageReceived)應該是別人的內部和形式的「ResumeAfter」法內。 –
我將表單代碼添加到了原始文章中。我也移動了context.Wait(...)調用,現在我得到了我的表單的開頭(消息+第一個字段提示符),但立即出現錯誤:'異常:捕獲環境的匿名方法閉包不可序列化,請考慮刪除環境捕獲或使用反射序列化代理:BotTest.Dialogs.LUISDialog + <> c__DisplayClass4_0' – Jeahel
正確,這是因爲異步(c,r)=>。將其移至某個方法並讓我知道。一旦你確認我可以制定答案。 –