我正在使用机器人框架,并且正在尝试使用 FormFlow 动态定义表单。我对一个特定领域有疑问:
.Field(new FieldReflector<IssueFormModel>(nameof(IssueResultModel.ProductPlatform))
.SetType(typeof(string))
.SetDefine(async (issue, field) =>
{
if (issue.ProductName != null)
{
foreach (var platform in productsWithPlatforms[issue.ProductName])
{
field.AddDescription(platform, platform).AddTerms(platform, platform);
}
}
return await Task.FromResult(true);
})
.SetPrompt(new PromptAttribute("Which platform of {ProductName}{||}?"))
.SetAllowsMultiple(false)
.SetValidate(async (state, value) => await ValidateProductPlatform(value, state)))
问题是ProductPlatform依赖于ProductName,因此它是一个字符串。这很好用,但是,通过这种方式,机器人不会显示可能平台的选项(尽管 {||} 在SetPrompt中有)。
当我将 type 设置为 nullSetType(null)
时,机器人现在将可能的平台显示为按钮,但是,当用户决定键入错误的平台而不是单击正确的平台时,它永远不会进入ValidateProductPlatform(我猜验证本身已经在SetDefine级别完成)。我需要通过ValidateProductPlatform验证用户输入的唯一原因是我想在 3 次尝试失败后取消表单。
那么,有什么方法可以实现这一点?:用户有基于 ProductName 的 ProductPlatorm 选项(作为按钮),但是他们没有单击,而是(可能)输入了错误的平台,并且在 3 次错误尝试后,表单结束。
PS:我看到了Microsoft Bot : How to capture Too Many Attempts in Form Flow?但我无法使用它,因为在我的情况下似乎 SetValidate被忽略了(当SetType(null)
)