在 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);
});
我正在尝试使用机器人框架构建一个机器人,我想使用 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);
});