2016-07-19 3 views
0

Я работаю над базовыми технологиями ботов, в одном из моих текущих проектов я хочу разрешить пользователю, только если он/она набирает «ivr» или «IVR», иначе она показывает некоторую обратную связь с пользователем.Как разрешить использование пользователя только в том случае, если он/она вводит «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(); 
    } 
}; 

Просьба сообщить мне, как решить эту проблему, используя концепцию потока форм.

-Pradeep

ответ

0

Ваш код выглядит правильно для меня - я могу только предложить отладки кода с пошаговым через отладчик и посмотреть, где логические тесты терпят неудачу.

Тем не менее, если это не работает для людей в Турции, это потому, что вы не должны использовать .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; 
} 
+0

ваши выше выглядит как для сравнения двух строк. но я хочу, когда когда-либо пользователь вводит «ivr или IVR» в эмуляторе канала бота, тогда я хочу разрешить пользователю получать доступ к следующим полям в потоке формы, иначе не разрешаю ему. – pradeep

+0

@pradeep Да, это то, что делает мой код. Какую проблему вы испытываете? – Dai

+0

Моя проблема в том, что я использовал концепцию потока форм в своем боте, но я боролся, когда когда-либо пользователь вводил «ivr или IVR», то только я мог позволить ему. В другом случае он отправляет пользователю сообщение с обратной связью. – pradeep

0

Наконец, я получил результат с любой проблемой.

вот мой обновленный код, позволяющий вводить только слово «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