Botframework `反馈`机器人对话中未显示文本

Botframework `反馈`机器人对话中未显示文本,botframework,Botframework,“我的formflow”对话框包含已应用自定义验证的字段 var form = builder .Field(new FieldReflector<CarValuationDialog>(nameof(UserName)) .SetActive(state => string.IsNullOrEmpty(state.UserName))) .Field(new FieldReflector<CarValuationDialog>(nameo

“我的formflow”对话框包含已应用自定义验证的字段

 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属性。模板覆盖是否适用于您?这对我来说是个新闻,使用您的方法配置模板是有效的。不确定为什么
模板[]
不适合您,但适合我。然而,你现在会生我的气的,我需要补充我的问题,因为我遗漏了一个关键的细节。有多个属性与此对话框关联,这意味着如果我输入任何其他问题的未知答案,他们也会得到“这不是有效数字。请再次输入它好吗?”的响应。很抱歉。我将编辑我的问题。这很有意义,似乎是一个完全合理的用例。今天我将进一步研究这一点,看看我是否能想出其他办法来满足你的需要。我真的非常感谢你的帮助。它非常有用。