在 FormFlow Bot Framework 中第一次错误尝试后,我如何验证并提供选项列表

How do i validate and give list of options after first wrong attempt in FormFlow Bot Framework

我正在尝试使用机器人框架构建一个机器人,我想使用 FormFlow 从用户那里获取部门名称的字符串,如果用户输入了错误的部门名称,我想验证并返回一个可供选择的选项列表来自

部门名称字符串:

[Prompt("What is your department name? {||}")]
 public string DepartmentName { get; set; }

部门名称字段如下:

.Field(nameof(DepartmentName),

            validate: async (state, response) =>
            {
                var value = (string)response;
                var result = new ValidateResult() { IsValid = false, Feedback = "Department name is not valid"};
                if (Enum.GetNames(typeof(Department)).Any(x => x.ToLower() == value))
                {
                    result.IsValid = true;
                    result.Feedback = null;
                    result.Value = value;
                }
                return result;
            })

部门枚举如下:

public enum Department
{
    hr = 1,
    sales,
    marketing,
    development,
    qm
}

如果第一次尝试出错,我如何提示用户使用枚举中的部门列表?特纳克斯

1) 您可以将选项添加到反馈的末尾:

.Field(nameof(DepartmentName),
validate: (state, response) =>
{
    var value = (string)response;
    string[] departments = Enum.GetNames(typeof(Department)).ToArray();
    var feedback = $"Department name is not valid. Options:\n\n {String.Join("\n\n", departments)}";

    var result = new ValidateResult() { IsValid = false,                                            
                                        Feedback = feedback  };

    if (departments.Any(x => x.ToLower() == value))
    {
        result.IsValid = true;
        result.Feedback = null;
        result.Value = value;
    }
    return Task.FromResult<ValidateResult>(result);
});

2) 你可以使用选项class(通常是为了消除歧义):

.Field(nameof(DepartmentName),
    validate: (state, response) =>
    {
        var value = (string)response;
        string[] departments = Enum.GetNames(typeof(Department)).ToArray();

        IEnumerable<Choice> choices = departments.Select(d => new Choice()
                {
                    Description = new DescribeAttribute(d, null, null, null, null),
                    Terms = new TermsAttribute() { Alternatives = new[] { d } },
                    Value = d
                }).ToArray();

        var result = new ValidateResult()
        {
            IsValid = false,
            Choices = choices,
            Feedback = "Department name is not valid."
        };

        if (departments.Any(x => x.ToLower() == value))
        {
            result.IsValid = true;
            result.Feedback = null;
            result.Value = value;
        }
        return Task.FromResult<ValidateResult>(result);
    });