Поймать ошибку ввода пользователя в режиме реального времени - PullRequest
0 голосов
/ 29 июня 2018

Я сделал это простое консольное приложение, которое требует от пользователя ввода имени пользователя и пароля. Затем данные сохраняются в БД. Для каждого столбца в Db я назначил ограниченное количество значений для типа данных. Например, пароль (varchar(5)) должен содержать не более 5 символов.

using System;

namespace MyConto
{
    public class NewUser
    {
        public static void NewUserRegistration()
        {
            Console.Write("Username: ");
            string user = Console.ReadLine();

            Console.Write("Password: ");
            string pass = Console.ReadLine();     
        }
    }
}

Теперь, как я могу в режиме реального времени (??) проверить, что пользователь пишет в консоли? Это вообще возможно? Например, сообщение, предупреждающее пользователя, если он пишет "password" в качестве пароля, что строка слишком длинная.

Спасибо

Ответы [ 4 ]

0 голосов
/ 29 июня 2018

Я предполагаю, что под словом «в режиме реального времени» вы подразумеваете, что вы не хотите, чтобы пользователь нажал клавишу ВВОД, прежде чем увидеть сообщение - поэтому, как только он наберет шестой символ, он скажет, что это слишком долго. Вы не можете сделать это с Console.ReadLine (). Вы могли бы сделать это с Console.ReadKey (), хотя это много усилий ... но просто для удовольствия:

class Program
{
    static void Main(string[] args)
    {
        //First clear the screen.  We need to have absolute knowledge of what's on 
        //the screen for this to work.
        Console.Clear();
        //hide the cursor as it has no real bearing on much....
        Console.CursorVisible = false;
        var user = GetLimitedInput("UserName?", 0, 10, true);
        var password = GetLimitedInput("Password?", 4, 5, false);

        Console.Clear();
        Console.WriteLine($"User is {user} and password is {password}");
    }


    private static string GetLimitedInput(string prompt, 
        int lineToShowPromptOn, int maxChars, bool showChars)
    {
        //set cursor to the suggested position
        Console.SetCursorPosition(0, lineToShowPromptOn);
        //output the prompt.
        Console.WriteLine(prompt);
        Console.SetCursorPosition(0, lineToShowPromptOn + 1);

        var finished = false;
        var inputText = string.Empty;

        while (!finished)
        {
            if (Console.KeyAvailable)
            {
                //remembr old input so we can re-display if required.
                var oldInput = inputText;
                var key = Console.ReadKey();
                //check for CTRL+C to quit
                if (key.Modifiers.HasFlag(ConsoleModifiers.Control) && key.KeyChar=='c')
                {
                    inputText = string.Empty;
                    finished = true;
                }
                //allow backspace
                else if (key.KeyChar == '\b')
                {
                    if (inputText.Length > 0)
                    {
                        inputText = inputText.Substring(0, inputText.Length - 1);
                    }
                }
                //check for return & finish if legal input.
                else if (key.KeyChar == '\r')
                {
                    if (inputText.Length<=maxChars)
                    {
                        finished = true;
                    }
                }
                else
                {
                    //really we should check for other modifier keys (CTRL, 
                    //ALT, etc) but this is just example.
                    //Add text onto the input Text
                    inputText += key.KeyChar;
                }

                if (inputText.Length > maxChars)
                {
                    //Display error on line under current input.
                    Console.SetCursorPosition(0, lineToShowPromptOn + 2);
                    Console.WriteLine("Too many characters!");
                }
                else
                {
                    //if not currently in an 'error' state, make sure we
                    //clear any previous error.
                    Console.SetCursorPosition(0, lineToShowPromptOn + 2);
                    Console.WriteLine("                     ");
                }
                //if input has changed, then refresh display of input.
                if (inputText != oldInput)
                {
                    Console.SetCursorPosition(0, lineToShowPromptOn + 1);
                    //do we show the input?
                    if (showChars)
                    {
                        //We write it out to look like we're typing, and add 
                        //a bunch of spaces as otherwise old input may be        
                        //left there.
                        Console.WriteLine(inputText+"            ");
                    }
                    else
                    {
                        //show asterisks up to length of input.
                        Console.WriteLine(new String('*', inputText.Length)+"            ");
                    }

                }

            }
        }

        return inputText;
    }       
}

Примечание: здесь есть много недостатков, но это только для иллюстрации:)

0 голосов
/ 29 июня 2018

Если вы хотите продолжать спрашивать пользователя, пока он не введет действительный пароль, вы можете сделать что-то вроде этого:

string ObtainPassword()
{
    string password;
    string passwordErrorMessage;
    while(true)
    {
        Console.Write("Password: ");
        password = Console.ReadLine();
        passwordErrorMessage = ValidatePassword(password);
        if (passwordErrorMessage == null)
            return password;

        Console.WriteLine($"\r\n*** {passwordErrorMessage}");
    }
}

Метод проверки пароля будет выглядеть следующим образом:

string ValidatePassword(string password)
{
    if(password.Length > 5) return "Password is too long";

    //Add other validations here as needed

    return null;
}
0 голосов
/ 29 июня 2018

Я закончил с этим:

using System;

namespace MyConto
{
    public class NewUser
    {
        public static void NewUserRegistration()
        {
            Console.Write("Username: ");
            string user = Console.ReadLine();

            Console.Write("Password: ");
            string pass = Console.ReadLine();
            while (pass.Length > 5)
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine("Insert a valid password (max 5 chars)\n");
                Console.ForegroundColor = ConsoleColor.White;
                Console.Write("Password: ");
                pass= Console.ReadLine();
            }     
        }
    }
}
0 голосов
/ 29 июня 2018

Добавить метод проверки, например:

private bool isValid(string input)
{
   //my validation logic
}

И использовать как:

  ...
string user = Console.ReadLine();
if (!isValid(user))
{
    ///my logic for warning the user that input is invalid
}
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...