Botframework `反馈`机器人对话中未显示文本
“我的formflow”对话框包含已应用自定义验证的字段Botframework `反馈`机器人对话中未显示文本,botframework,Botframework,“我的formflow”对话框包含已应用自定义验证的字段 var form = builder .Field(new FieldReflector<CarValuationDialog>(nameof(UserName)) .SetActive(state => string.IsNullOrEmpty(state.UserName))) .Field(new FieldReflector<CarValuationDialog>(nameo
var form = builder
.Field(new FieldReflector<CarValuationDialog>(nameof(UserName))
.SetActive(state => string.IsNullOrEmpty(state.UserName)))
.Field(new FieldReflector<CarValuationDialog>(nameof(ValuationOption))
.SetPrompt(new PromptAttribute($"Hello {{UserName}}.<br /><br />Are you looking to get an price estimate for a car you’re selling, or for a car you’re looking to buy? {{||}}")))
.Field(new FieldReflector<CarValuationDialog>(nameof(RegistrationNumber))
.SetDefine(RegistrationNumberDefinitionMethod))
.Field(new FieldReflector<CarValuationDialog>(nameof(Mileage))
.SetValidate(async (state, value) =>
{
var result = new ValidateResult { IsValid = true, Value = value };
if (int.TryParse(value.ToString(), out int mileage))
{
result.IsValid = true;
}
else
{
result.Feedback = "That isn't valid number. Can you enter it again please?";
result.IsValid = false;
}
return await Task.FromResult(result);
}))
.Field(nameof(PreviousOwnerOption),
active: carValuationDialog => carValuationDialog.ValuationOption == ValuationOptions.LookingToSell)
.Field(nameof(ServiceHistoryOption),
active: carValuationDialog => carValuationDialog.ValuationOption == ValuationOptions.LookingToSell)
.Confirm(Confirmation)
.OnCompletion(GetValuationAndDisplaySummaryToUser);
var form=builder
.Field(新的FieldReflector(名称(用户名))
.SetActive(state=>string.IsNullOrEmpty(state.UserName)))
.字段(新字段反射器(名称(估价选项))
.SetPrompt(新PromptAttribute($“Hello{{{UserName}.
您是希望获得您正在出售的汽车的价格估算,还是希望购买的汽车的价格估算?{{{|}”))
.字段(新字段反射器(名称(注册号))
.SetDefine(注册号定义方法))
.字段(新字段反射镜(名称(里程))
.SetValidate(异步(状态、值)=>
{
var result=newvalidateResult{IsValid=true,Value=Value};
if(int.TryParse(value.ToString(),out int-milies))
{
result.IsValid=true;
}
其他的
{
result.Feedback=“这不是有效的数字。您能再输入一次吗?”;
result.IsValid=false;
}
返回等待任务。FromResult(result);
}))
.字段(名称(PreviousOwnerOption),
活动:carValuationDialog=>carValuationDialog.ValuationOption==ValuationOptions.LookingToSell)
.字段(名称(ServiceHistoryOption),
活动:carValuationDialog=>carValuationDialog.ValuationOption==ValuationOptions.LookingToSell)
.确认
.OnCompletion(获取估价和显示汇总器);
当执行SetValidate()
且给定的里程值不是int
时,将执行result.Feedback=…
行。但是,我看到的不是消息“这不是有效的里程值。请重新输入好吗?”而是
完全发现,我在dialog类上声明了以下属性
[模板(TemplateUsage.notUnderstanding,“对不起,我不懂“{0}”)]
但是我认为结果。在这种情况下会向用户显示反馈文本吗?不使用模板[]
会在用户输入无效里程数时显示以下文本
“d”不是汽车里程选项
这看起来很垃圾,这也是我使用模板[]
覆盖的原因。编辑
我可以通过将模板应用到字段本身进行验证来实现这一点。这应该是您正在寻找的确切行为。请注意,我没有进行广泛的测试,我只是想让总体思路发挥作用。以下是我使用的代码:
[Serializable]
public class SandwichOrder
{
//public PreviousOwnerOptions Options;
[Template(TemplateUsage.NotUnderstood, "Sorry, I don't understand '{0}'.")]
[Prompt("What is the {&}?")]
public int Mileage;
[Template(TemplateUsage.NotUnderstood, "Sorry, This is not valid '{0}'.")]
[Prompt("How many {&}?")]
public int Days;
public static IForm<SandwichOrder> BuildForm()
{
var form = new FormBuilder<SandwichOrder>()
.Field(new FieldReflector<SandwichOrder>(nameof(Mileage))
.SetValidate(async (state, value) =>
{
var result = new ValidateResult {IsValid = true, Value = value};
if (int.TryParse(value.ToString(), out int mileage))
{
result.IsValid = true;
}
else
{
result.IsValid = false;
}
return await Task.FromResult(result);
}))
.Field(new FieldReflector<SandwichOrder>(nameof(Days))
.SetValidate(async (state, value) =>
{
var result = new ValidateResult { IsValid = true, Value = value };
if (int.TryParse(value.ToString(), out int days))
{
result.IsValid = true;
}
else
{
result.IsValid = false;
}
return await Task.FromResult(result);
}));
return form.Build();
}
}
[可序列化]
公务舱三明治
{
//公共优先选择权;
[模板(TemplateUsage.notUnderstanding,“对不起,我不理解“{0}”。”)
[提示(“什么是{&}?”)]
公共国际里程;
[模板(TemplateUsage.notUnderstanding,“抱歉,这不是有效的“{0}”)]
[提示(“多少{&}?”)]
公众假期;
公共静态表单BuildForm()
{
var form=new FormBuilder()
.字段(新字段反射镜(名称(里程))
.SetValidate(异步(状态、值)=>
{
var result=newvalidateResult{IsValid=true,Value=Value};
if(int.TryParse(value.ToString(),out int-milies))
{
result.IsValid=true;
}
其他的
{
result.IsValid=false;
}
返回等待任务。FromResult(result);
}))
.现场(新现场反射器(名称(天))
.SetValidate(异步(状态、值)=>
{
var result=newvalidateResult{IsValid=true,Value=Value};
if(int.TryParse(value.ToString(),out int天))
{
result.IsValid=true;
}
其他的
{
result.IsValid=false;
}
返回等待任务。FromResult(result);
}));
返回form.Build();
}
}
这就产生了这样的结果:
啊,对不起,不是模板属性引起了问题,而是我提供给结果的文本。验证失败时,不会向用户显示反馈。即使我完全删除模板
属性,反馈文本仍然不会显示,相反,我得到“d”不是汽车里程选项。
如果我输入“d”作为里程值。看起来.Feedback
属性被忽略了。我得到了这个结果,您可以使用我介绍的方法来实现您想要的相同结果,而不是使用Feedback属性。模板覆盖是否适用于您?这对我来说是个新闻,使用您的方法配置模板是有效的。不确定为什么模板[]
不适合您,但适合我。然而,你现在会生我的气的,我需要补充我的问题,因为我遗漏了一个关键的细节。有多个属性与此对话框关联,这意味着如果我输入任何其他问题的未知答案,他们也会得到“这不是有效数字。请再次输入它好吗?”的响应。很抱歉。我将编辑我的问题。这很有意义,似乎是一个完全合理的用例。今天我将进一步研究这一点,看看我是否能想出其他办法来满足你的需要。我真的非常感谢你的帮助。它非常有用。