我有两个问题
1( 如何将自定义值发送到机器人框架中的活动?我在发布方法中有以下代码
UserDetails usr = new UserDetails();
usr.LoginID = l.LoginID
userData.SetProperty<string>("LoginID", usr.LoginID);
sc.BotState.SetUserData(activity.ChannelId, activity.From.Id, userData);
现在我想在我的对话框/表单生成器类中访问此属性,如何实现这一点?
下面是我的表单生成器类
[Serializable]
public class FlightBooking
{
public static IForm<FlightBooking> BuildForm()
{
return new FormBuilder<FlightBooking>().Message("Tell me flight details!")
.Field(nameof(title))
....
....
}
}
2( 如何在表单生成器/对话框类中访问 BotData 用户定义的属性?
如上面的代码所示,您可以看到我已经设置了 EmailId 属性,如何在表单构建器类中访问该属性值?
1(我不明白你在用BotState
做什么. 您提出的问题是"如何将自定义值发送到活动...",但您实际上是将值保存到 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( 您可以发送活动。ChannelId 和 BuildForm 方法的 activity.From.Id:
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();
}
}
但是,您也可以只将整个活动对象发送到 BuildForm 方法,而根本不用 UserData。