2016-11-08 40 views
2

我試圖在不同的對話框之間傳遞狀態,似乎是a)不正確調用對話框或b)不正確使用botstate(或兩者)。Bot框架 - 對話框之間的Botstate丟失值

任何人都可以告訴我什麼,當我打開第二個對話框時,我失去了什麼?它使用context.forward()打開;

在messagescontroller我很容易能夠設置狀態;

StateClient stateClient = activity.GetStateClient(); 
BotData userData = await stateClient.BotState.GetUserDataAsync(activity.ChannelId, activity.From.Id); 
userData.SetProperty<bool>("SessionActive", true); 
await stateClient.BotState.SetUserDataAsync(activity.ChannelId, activity.From.Id, userData); 

然後我打開一個對話框來控制對其他對話框的訪問;

await Conversation.SendAsync(activity,() => new DialogController()); 

這是一個單獨的類;

public class DialogController : IDialog<object> 

在這個對話框中,我可以訪問我設置爲'true'的值 - 這可以工作;

StateClient stateClient = new StateClient(new Uri(message.ServiceUrl)); 
BotData userData = await stateClient.BotState.GetUserDataAsync(message.ChannelId, message.From.Id); 
userData.GetProperty<bool>("SessionActive") 

但是,在這個對話框中,我繼續打開第二個對話框,依賴於狀態;

await context.Forward(new SubDialog(), ThrowOutTask, message, cts.Token); 

這也是一個單獨的類;

public class SubDialog: IDialog<object> 

然而,當我試着像以前一樣檢索「SessionActive」狀態,在完全相同的方式,該值爲false(即它的實例化的第一次)..?

回答

0

當您從Dialog類請求狀態時,應該使用上下文進行操作。

bool sessionActive = context.UserData.Get<bool>("SessionActive"); 
+0

工作時使用UserData.SetValue,非常感謝。 – Taylor