Как разрешить пользователю, только если он / она вводит "ivr" или "IVR", используя концепцию Form Flow
Я работаю над технологией фреймворка ботов, в одном из моих текущих проектов я хочу разрешить пользователю, только если он или она введет "ivr" или "IVR", в противном случае он покажет некоторую обратную связь с пользователем.
Для этого я написал ниже строки кода, но этот код показывает некоторые неправильные результаты для пользователя. Даже если пользователь вводит ivr или IVR, он отображает обратную связь с пользователем в первый раз, но со второго раза он работает правильно.
[Serializable]
class Customer
{
//Create Account Template
[Prompt("Please send any of these commands like **IVR** (or) **ivr**.")]
public string StartingWord;
public static IForm<Customer> BuildForm()
{
OnCompletionAsyncDelegate<Customer> accountStatus = async (context, state) =>
{
await Task.Delay(TimeSpan.FromSeconds(5));
await context.PostAsync("We are currently processing your account details. We will message you the status.");
};
var builder = new FormBuilder<Customer>();
return builder
//.Message("Welcome to the BankIVR bot! To start an conversation with this bot send **ivr** or **IVR** command.\r \n if you need help, send the **Help** command")
.Field(nameof(Customer.StartingWord), validate: async (state, response) =>
{
var result = new ValidateResult { IsValid = true, Value = response };
string str = (response as string);
if (str.ToLower() != "ivr")
{
result.Feedback = "I'm sorry. I didn't understand you.";
result.IsValid = false;
return result;
}
else if (str.ToLower() == "ivr")
{
result.IsValid = true;
return result;
}
else
{
return result;
}
})
.OnCompletion(accountStatus)
.Build();
}
};
Подскажите, пожалуйста, как решить эту проблему, используя концепцию Form Flow.
-Pradeep
2 ответа
Ваш код выглядит правильно для меня - я могу только предложить вам отладить ваш код с помощью пошагового отладчика и посмотреть, где проваливаются логические тесты.
Тем не менее, если это не работает для людей в Турции, это потому, что вы не должны использовать .ToLower()
для нормализации текста, например .ToLower()
метод не работает для текста, который содержит турецкий без точек 'I'
персонаж: http://archives.miloush.net/michkap/archive/2004/12/02/273619.html
Кроме того, ваш else
дело никогда не будет сбито, потому что ваши две предыдущие проверки (!=
а также ==
) охватывать все возможные случаи (компилятор C# в настоящее время не достаточно сложен, чтобы пометить else
дело как недоступный код).
Правильный способ сравнения без учета регистра - String.Equals
:
if( "ivr".Equals( str, StringComparison.InvariantCultureIgnoreCase ) ) {
result.IsValid = true;
return result;
}
else {
result.Feedback = "I'm sorry. I didn't understand you.";
result.IsValid = false;
}
Наконец, я получил результат без каких-либо проблем.
Вот мой обновленный код, позволяющий только пользователю вводить слово "ivr или IVR", чтобы начать беседу о потоке форм с ботом.
.Field(nameof(Customer.StartingWord), validate: async (state, response) =>
{
var result = new ValidateResult { IsValid = true, Value = response };
string str = (response as string);
if ("ivr".Equals(str, StringComparison.InvariantCultureIgnoreCase))
{
//result.IsValid = true;
//return result;
}
else
{
result.Feedback = "I'm sorry. I didn't understand you.";
result.IsValid = false;
//return result;
}
return result;
})
-Pradeep