如何将用户定义的详细信息发送到 Bot Framework 应用程序中的 activity 或如何在我的对话框中访问 BotData class

How to send user defined details to activity in Bot Framework App Or How to access BotData in my dialog class

我有两个问题

1) 如何在 Bot Framework 中将自定义值发送到 Activity? 我在 post 方法

中有以下代码
UserDetails usr = new UserDetails();
usr.LoginID = l.LoginID
userData.SetProperty<string>("LoginID", usr.LoginID);
sc.BotState.SetUserData(activity.ChannelId, activity.From.Id, userData);

现在我想在我的 Dialog/FormBuilder class 中访问这个 属性,如何实现?

下面是我的表单生成器class

[Serializable]
public class FlightBooking
{
public static IForm<FlightBooking> BuildForm()
    {
    return new FormBuilder<FlightBooking>().Message("Tell me flight details!")
    .Field(nameof(title))
    ....
    ....
    }
}

2) 如何在 FormBuilder/Dialog class 中访问 BotData 用户定义的属性?

在上面的代码中,您可以看到我已经设置了 EmailId 属性,如何在 formbuilder class 中访问该 属性 值?

1) 我不明白你在用 BotState 做什么。你问的问题是 "How to send custom values to Activity...",但你实际上是在将值保存到 UserData 中。另外,您提供的代码似乎不完整。

您可以这样保存 UserData

var stateClient = activity.GetStateClient();
BotData userData = stateClient.BotState.GetUserData(activity.ChannelId, activity.From.Id);
userData.SetProperty<string>("LoginID", l.LoginID);
stateClient.BotState.SetUserData(activity.ChannelId, activity.From.Id, userData);

2) 您可以将 activity.ChannelId 和 activity.From.Id 发送到 BuildForm 方法:

await Conversation.SendAsync(activity, ()=> FormDialog.FromForm(() => FlightBooking.BuildForm(activity.ChannelId, activity.From.Id)));

并创建 StateClient,然后访问 UserData:

public class FlightBooking
{
    public string title { get; set; }
    public static IForm<FlightBooking> BuildForm(string channelId, string userId)
    {
        string appId = ConfigurationManager.AppSettings["MicrosoftAppId"];
        string password = ConfigurationManager.AppSettings["MicrosoftAppPassword"];
        StateClient stateClient = new StateClient(new MicrosoftAppCredentials(appId, password));
        BotData userData = stateClient.BotState.GetUserData(channelId, userId);
        var loginId = userData.GetProperty<string>("LoginID");

        //do something with loginId?

        return new FormBuilder<FlightBooking>().Message("Tell me flight details!")
            .Field(nameof(title))
            .Build();
    }
}

但是,您也可以只将整个 activity 对象发送到 BuildForm 方法,根本不用理会 UserData。