我正在使用带有 FormFlow 的 Microsoft Bot Framework 来让用户填写表格。假设我的表单有两个字段:
- 国家
- 城市
所以我有两个枚举:
public enum Country {
France, Germany
}
public enum City {
Paris, Berlin
}
字段City总是依赖于字段Country,因为一个城市属于一个国家。这意味着用户应该只能填写France+Paris或Germany+Berlin。
我的表格:
public class LocationForm
{
[Prompt("Which country? {||}")]
public Country? Country;
[Prompt("Which city? {||}")]
public City? City;
}
我的建设者:
private static IForm<LocationForm> BuildLocationForm()
{
return new FormBuilder<LocationForm>()
.Field(nameof(Country))
.Field(new FieldReflector<LocationForm>(nameof(LocationForm.City))
.SetDefine(async (state, field) =>
{
switch (state.Country)
{
case Country.France:
field.RemoveValue(City.Berlin);
break;
case Country.Germany:
field.RemoveValue(City.Paris);
break;
}
return true;
})
.Confirm(async (state) =>
new PromptAttribute(
"You selected {Country} and {City}, is that correct? {||}"))
.Build();
}
我不知道RemoveValue的用法在这里是否正确,感觉有点被黑了,但到目前为止它仍然有效。
用户第一次填写表格时一切正常,用户只能根据之前选择的国家/地区选择巴黎或柏林。但是,当用户用No回答确认问题时,可以更改Country或City。当用户然后将国家从法国更改为德国时,FormFlow 将询问:
你选择了德国和巴黎,对吗?
这显然是不正确的,但仍然可以回答是。
我想实现的是,每当通过确认对话框更改国家/地区时,用户也必须根据国家/地区字段中的更改来更改城市选择。
我在玩SetNext方法,但我想不出任何有用的东西。
我在这里走错了吗?如果不破解整个 FormFlow 实现,这是否可能?
我将不胜感激任何帮助!
提前致谢!
更新(附加信息):我尝试了微软在此处找到的 Sandwich Bot 示例,它似乎具有相同的(错误)行为。订购一英尺长的三明治时,您将获得额外的(免费饼干/饮料) 。确认后将长度更改为六英寸,您仍然有多余的,但只需支付六英寸。