Bot Builder Form Flow枚举响应识别异常问题咨询
解决Form Flow Dialog枚举选项无法识别的问题
我来帮你搞定这个枚举选项不被识别的问题哈,结合你贴的代码片段,大概率是这几个细节没处理到位,咱们一步步排查:
1. 先检查TitleBot枚举的定义
Form Flow对枚举的识别依赖于显示文本和枚举值的映射,如果你的枚举没加Description属性,用户输入的文本(比如"Mr.")可能和枚举标识符(比如Mr)不匹配,导致识别失败。建议给枚举值加上描述:
[Serializable] public enum TitleBot { [Description("Mr.")] Mr, [Description("Ms.")] Ms, [Description("Mrs.")] Mrs, [Description("Dr.")] Dr }
这样Form Flow会把Description里的文本作为显示选项,同时能识别用户输入的对应文本。
2. 优化枚举字段的模板与大小写配置
你给Title字段加了Template属性,但可以补充大小写归一化配置,避免用户输入大小写不一致导致识别失败:
[Serializable] public class ContactBot { [Template(TemplateUsage.EnumSelectOne,"How do you like to be addressed - {||}", "Please select a title to address you by - {||}")] [Prompt("Please select a title (Mr./Ms./Mrs./Dr.):", FieldCase = CaseNormalization.InitialUpper)] public TitleBot? Title { get; set; } [Prompt("What's your first name?", FieldCase = CaseNormalization.InitialUpper)] public string FirstName { get; set; } [Prompt("and your last name?")] public string LastName { get; set; } }
这里给Title的Prompt也加上了FieldCase,确保用户输入的文本会被统一格式后再匹配枚举值。
3. 配置Form Builder的枚举识别规则
在创建Form实例时,可以显式配置枚举字段的识别逻辑,比如允许用户输入序号或文本,还能自定义验证:
var form = new FormBuilder<ContactBot>() .Field(nameof(ContactBot.Title), options => { // 允许用户输入序号(比如1选Mr.)或文本 options.SetEnumSelectOne(); // 忽略大小写匹配 options.SetCase(CaseNormalization.None); }) .Build();
这样不管用户输入的是"mr"、"MR."还是"1",都能正确匹配到对应的枚举值。
4. 测试排除可空枚举的影响
你的Title字段是可空类型(TitleBot?),虽然Form Flow支持可空枚举,但如果字段是必填项,建议改成非空类型public TitleBot Title { get; set; },或者在Form Builder里配置必填:
.Field(nameof(ContactBot.Title), options => options.IsRequired(true))
避免因为可空逻辑导致识别时的异常。
按照上面的步骤调整后,应该就能解决枚举选项无法识别的问题啦~
内容的提问来源于stack exchange,提问作者Andrew Chilcott
相关产品推荐
相关产品推荐

