RegularExpressionValidator, не стреляющий в пробельную запись

Простой ответ, каждый раз, когда операция невозможна (или из-за приложения ИЛИ ИЗ-ЗА потому что это нарушило бы бизнес-логику). Если метод вызывается и это невозможный сделать то, что метод был записан, чтобы сделать, выдать Исключение. Хороший пример - то, что конструкторы всегда бросают ArgumentExceptions, если экземпляр не может быть создан с помощью предоставленных параметров. Другим примером является InvalidOperationException, который брошен, когда операция не может быть выполнена из-за состояния другого участника или членов класса.

В Вашем случае, если метод как Вход в систему (имя пользователя, пароль) вызывается, если имя пользователя не допустимо, это действительно корректно для броска UserNameNotValidException или PasswordNotCorrectException, если пароль является неправильным. Пользователь не может быть зарегистрирован с помощью предоставленного параметра (параметров) (т.е. это невозможно, потому что это нарушило бы аутентификацию), поэтому выдайте Исключение. Хотя у меня могли бы быть Ваши два Исключения, наследовались ArgumentException.

Однако если Вы хотите НЕ выдать Исключение, потому что отказ входа в систему может быть очень распространен, одна стратегия состоит в том, чтобы вместо этого создать метод, который возвращает типы, которые представляют различные отказы. Вот пример:

{ // class
    ...

    public LoginResult Login(string user, string password)
    {
        if (IsInvalidUser(user))
        {
            return new UserInvalidLoginResult(user);
        }
        else if (IsInvalidPassword(user, password))
        {
            return new PasswordInvalidLoginResult(user, password);
        }
        else
        {
            return new SuccessfulLoginResult();
        }
    }

    ...
}

public abstract class LoginResult
{
    public readonly string Message;

    protected LoginResult(string message)
    {
        this.Message = message;
    }
}

public class SuccessfulLoginResult : LoginResult
{
    public SucccessfulLogin(string user)
        : base(string.Format("Login for user '{0}' was successful.", user))
    { }
}

public class UserInvalidLoginResult : LoginResult
{
    public UserInvalidLoginResult(string user)
        : base(string.Format("The username '{0}' is invalid.", user))
    { }
}

public class PasswordInvalidLoginResult : LoginResult
{
    public PasswordInvalidLoginResult(string password, string user)
        : base(string.Format("The password '{0}' for username '{0}' is invalid.", password, user))
    { }
}

Большинству разработчиков преподают избежать Исключений из-за издержек, вызванных путем броска их. Замечательно быть сознательным ресурс, но обычно не за счет Вашего проектирования приложений. Это - вероятно, причина, Вам сказали не выдать Ваши два Исключения. Использовать ли Исключения или не обычно сводится к тому, как часто Исключение будет происходить. Если это - довольно общее или довольно вероятный результат, это - когда большинство разработчиков избежит Исключений и вместо этого создаст другой метод для указания на отказ из-за воображаемого потребления ресурсов.

Вот пример избегания использования Исключений в сценарии, любят просто описанный, с помощью Попытки () шаблон:

public class ValidatedLogin
{
    public readonly string User;
    public readonly string Password;

    public ValidatedLogin(string user, string password)
    {
        if (IsInvalidUser(user))
        {
            throw new UserInvalidException(user);
        }
        else if (IsInvalidPassword(user, password))
        {
            throw new PasswordInvalidException(password);
        }

        this.User = user;
        this.Password = password;
    }

    public static bool TryCreate(string user, string password, out ValidatedLogin validatedLogin)
    {
        if (IsInvalidUser(user) || 
            IsInvalidPassword(user, password))
        {
            return false;
        }

        validatedLogin = new ValidatedLogin(user, password);

        return true;
    }
}
6
задан rahul 6 July 2009 в 06:05
поделиться

5 ответов

Это сделано намеренно и имеет тенденцию сбивать с толку многих людей. RegularExpressionValidator не делает поле обязательным, а позволяет ему быть пустым и принимать пробелы. Формат \ d + правильный. Даже использование ^ \ d + $ приведет к той же проблеме с разрешением пробелов. Единственный способ заставить это запретить пробелы - это также включить RequiredFieldValidator для работы с тем же элементом управления.

Это соответствует документации RegularExpressionValidator , в которой говорится:

Проверка успешна, если ввод контроль пуст. Если значение требуется для соответствующего ввода control используйте RequiredFieldValidator контроль в дополнение к RegularExpressionValidator control.

A regular expression check of the field in the code-behind would work as expected; this is only an issue with the RegularExpressionValidator. So you could conceivably use a CustomValidator instead and say args.IsValid = Regex.IsMatch(txtInput.Text, @"^\d+$") and if it contained whitespace then it would return false. But if that's the case why not just use the RequiredFieldValidator per the documentation and avoid writing custom code? Also a CustomValidator means a mandatory postback (unless you specify a client validation script with equivalent javascript regex).

12
ответ дан 8 December 2019 в 16:09
поделиться

Ваш вопрос немного сложен для понимания, но если вы спрашиваете, как написать обычное выражение, которое принимает только цифры. Думаю, ваша ошибка заключается в использовании косой черты вместо обратной. Попробуйте

"\ d +"

1
ответ дан 8 December 2019 в 16:09
поделиться

RegularExpressionValidator - хорошая оболочка для выполнения проверок регулярных выражений, но она не проверяет пустые элементы управления. Вы можете использовать CustomValidator, а затем выполнить проверку регулярного выражения в функции javascript, которую вы присоединяете к валидатору.

Он будет проверять пустой (пустой) элемент управления, если вы установите свойство ValidateEmptyText значение true.

Вы можете узнать больше о CustomValidators в MSDN здесь .

1
ответ дан 8 December 2019 в 16:09
поделиться

попробуйте использовать Ajax FilteredTextbox, это не даст места ....... http://www.asp.net/ajaxLibrary/AjaxControlToolkitSampleSite/FilteredTextBox/FilteredTextBox.aspx

1
ответ дан 8 December 2019 в 16:09
поделиться

Попробуйте использовать ^ \ d + $, чтобы цифры заполняли всю строку. ^ = начало строки $ = конец строки

0
ответ дан 8 December 2019 в 16:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: