ASP.NET NullReferenceException - PullRequest
       3

ASP.NET NullReferenceException

0 голосов
/ 24 февраля 2012

Я пытаюсь записать данные для входа пользователя в базу данных. Когда я нажимаю кнопку отправки, я получаю исключение NullReferenceException. Есть 4 текстовых поля Имя пользователя, адрес электронной почты, пароль и пароль подтверждения.

protected void Button1_Click(object sender, EventArgs e)
        {
            if ((RegisterUserWizardStep.FindControl("Password") as TextBox).Text == (RegisterUserWizardStep.FindControl("ConfirmPassword") as TextBox).Text)
           {
                //call the method to execute insert to the database
                ExecuteInsert((RegisterUserWizardStep.FindControl("UserName") as TextBox).Text,
                              (RegisterUserWizardStep.FindControl("Email") as TextBox).Text,
                             (RegisterUserWizardStep.FindControl("Password") as TextBox).Text);
                Response.Write("Record was successfully added!");
                ClearControls(Page);
          }
            else
            {
                Response.Write("Password did not match");
                (RegisterUserWizardStep.FindControl("Password") as TextBox).Focus();
           }
        }

Спасибо.

Ответы [ 4 ]

1 голос
/ 24 февраля 2012

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

Нулевое исключение, которое вы видите, почти наверняка, потому что FindControl (X) возвращает ноль

Лучший способ проверки - сделать что-то вроде:

TextBox myTextBox = RegisterUserWizardStep.FindControl(X) as TextBox;

if(myTextBox != null){
  //Continue
}
else{
  //Write out some error information - now you know what the problem is.
}

Кроме того, и это не связано с вашей непосредственной ошибкой, но затем вы вводите содержимое каждого текстового поля непосредственно в ваш метод ExecuteInsert - вам лучше провести некоторую проверку, просто чтобы проверить ожидаемые значения.

0 голосов
/ 24 февраля 2012

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

Вместо

if ((RegisterUserWizardStep.FindControl("Password") as TextBox).Text 

try

TextBox passwordTextBox = RegisterUserWizardStep.FindControl("Password") as TextBox;
// .. same for username and email
if ((passwordTextBox != null) && (usernameTextBox != null) ... )
{
 // Do something with the textboxes
}
// else you have a bug

Это также предотвратит повторение кода FindControl для того же элемента управления (принцип DRY)

0 голосов
/ 24 февраля 2012

В своем описании вы сказали, что у вас есть Username TextBox.

Код ищет RegisterUserWizardStep.FindControl("UserName").

Это опечатка в вопросе? в противном случае это может быть причиной исключения.

0 голосов
/ 24 февраля 2012

Код, подобный RegisterUserWizardStep.FindControl("UserName") as TextBox, вернет null, либо если элемента управления с именем UserName нет, либо элемент управления с именем UserName не может быть преобразован в TextBox. Скорее всего, это источник вашего исключения, поскольку вы пытаетесь получить свойство Text ссылки, которая может быть null.

Чтобы лучше понять, в чем проблема, вы можете определить функцию расширения:

static class ControlExtensions {

  public T Find(this Control parent, String name) where T : Control {
    var control = parent.FindControl(name);
    if (control == null)
      throw new ArgumentException(String.Format("Cannot find control named '{0}'.", name);
    var t = control as T;
    if (t == null)
      throw new ArgumentException(String.Format("Control named '{0}' does not have type '{1}.", name, typeof(T).Name);
    return t;
  }

}

Затем можно получить свойство Text элемента управления UserName:

RegisterUserWizardStep.Find<TextBox>("UserName").Text

Этот вызов вызовет более описательное исключение, если элемент управления не найден.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...