JSON FormFlow对话框使用问询及C#实现代码解析
在JSON FormFlow对话框中支持“其他”自定义输入的实现方案
我来帮你搞定在JSON FormFlow里添加自定义“其他”答案的问题,结合你的代码场景,分步骤给你讲清楚怎么做:
1. 修改JSON表单定义,添加“其他”选项与关联字段
首先要在你的JSON表单配置里,给枚举字段加一个Other选项,同时新增一个字符串字段用来接收用户的自定义输入,关键是用Dependencies让这个字段只在用户选了Other时才出现。
举个示例(假设你的枚举字段是FavoriteColor):
{ "Fields": [ { "Name": "FavoriteColor", "Prompt": "What's your favorite color?", "Type": "Enum", "EnumValues": [ {"Value": "Red", "DisplayName": "Red"}, {"Value": "Blue", "DisplayName": "Blue"}, {"Value": "Green", "DisplayName": "Green"}, {"Value": "Other", "DisplayName": "Other (specify)"} ] }, { "Name": "FavoriteColorOther", "Prompt": "Please enter your custom color:", "Type": "String", "Dependencies": [{"Field": "FavoriteColor", "Value": "Other"}] } ] }
2. 在C#代码中处理表单提交后的逻辑
当用户完成表单后,你需要在DialogCompleted方法里判断用户是否选了Other,然后把自定义字段的值作为最终结果使用。给你补全这个方法的示例:
private async Task DialogCompleted(IDialogContext context, IAwaitable<JObject> result) { var formResponse = await result; string selectedValue = formResponse["FavoriteColor"].ToString(); // 如果用户选了Other,替换为自定义输入的内容 if(selectedValue == "Other") { selectedValue = formResponse["FavoriteColorOther"]?.ToString() ?? "No custom input provided"; } // 这里写你的后续业务逻辑,比如回复用户 await context.PostAsync($"Got it! Your selection is: {selectedValue}"); context.Wait(MessageReceivedAsync); }
3. 额外优化建议
- 添加输入验证:给自定义字段加验证规则,确保用户输入不为空,比如在JSON的
FavoriteColorOther字段里加:"Validation": { "Regex": "^.+$", "ErrorMessage": "Please enter a valid custom value." } - 简化启动逻辑:你的
StartAsync方法可以直接启动FormDialog,不用先等待消息,简化后代码更简洁:public async Task StartAsync(IDialogContext context) { var formDialog = FormDialog.FromForm(() => BuildJsonForm(), FormOptions.PromptInStart); context.Call(formDialog, DialogCompleted); } - 统一字段处理:如果有多个枚举字段需要支持“其他”,可以把这个逻辑封装成通用方法,避免重复代码。
内容的提问来源于stack exchange,提问作者Vladimir B
相关产品推荐
相关产品推荐

