Простой ответ, каждый раз, когда операция невозможна (или из-за приложения ИЛИ ИЗ-ЗА потому что это нарушило бы бизнес-логику). Если метод вызывается и это невозможный сделать то, что метод был записан, чтобы сделать, выдать Исключение. Хороший пример - то, что конструкторы всегда бросают 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;
}
}
Это сделано намеренно и имеет тенденцию сбивать с толку многих людей. 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).
Ваш вопрос немного сложен для понимания, но если вы спрашиваете, как написать обычное выражение, которое принимает только цифры. Думаю, ваша ошибка заключается в использовании косой черты вместо обратной. Попробуйте
"\ d +"
RegularExpressionValidator - хорошая оболочка для выполнения проверок регулярных выражений, но она не проверяет пустые элементы управления. Вы можете использовать CustomValidator, а затем выполнить проверку регулярного выражения в функции javascript, которую вы присоединяете к валидатору.
Он будет проверять пустой (пустой) элемент управления, если вы установите свойство ValidateEmptyText
значение true.
Вы можете узнать больше о CustomValidators в MSDN здесь .
попробуйте использовать Ajax FilteredTextbox, это не даст места ....... http://www.asp.net/ajaxLibrary/AjaxControlToolkitSampleSite/FilteredTextBox/FilteredTextBox.aspx
Попробуйте использовать ^ \ d + $, чтобы цифры заполняли всю строку. ^ = начало строки $ = конец строки