Исключение Null Reference при доступе к свойству в OnClick

StackOverflow https://stackoverflow.com/questions/2704952

  •  01-10-2019
  •  | 
  •  

Вопрос

Помогите, пожалуйста, разобраться, что не так с этим кодом:

У меня есть страница ASP.NET, на которой видна одна кнопка.

Когда пользователь нажимает на нее, создается экземпляр MyClass (его реализация находится в каталоге AppCode) и он становится невидимым (кнопка2 становится видимой).

Когда я нажимаю кнопку 2, возникает исключение «Ссылка на объект не установлена ​​на экземпляр объекта».

В чем проблема?

{
    public MyClass noviTest;

    protected void Page_Load(object sender, EventArgs e)
    {
    }

    protected void Button1_Click(object sender, EventArgs e)
    {
        noviTest = new MyClass(TextBox1.Text);
        Button1.Visible = false;
        Button2.Visible = true;
    }

    protected void Button2_Click(object sender, EventArgs e)
    {
        Label1.Text=noviTest.getID; //this is the critical line
    }
}
Это было полезно?

Решение

Поскольку при обратной передаче ссылка noviTest на MyClass не воссоздается.

Вы можете добавить его в состояние просмотра, чтобы сохранить ссылку на него.(Предполагая, что MyClass сериализуем).
В Button1_Click:

ViewState("noviTest") = noviTest;

Затем в Button2_Click:

var noviTest = ViewState("noviTest");

Другие советы

noviTest является нулевым внутри Button2_Click.

Попробуйте что-то вроде этого:

protected void Page_Load(object sender, EventArgs e)
{
    noviTest = new MyClass(TextBox1.Text);
}
protected void Button1_Click(object sender, EventArgs e)
{
    Button1.Visible = false;
    Button2.Visible = true;    
}
protected void Button2_Click(object sender, EventArgs e)
{
    Label1.Text = noviTest.getID;
}

Это вызовет noviTest будет создаваться при каждом запросе страницы, независимо от того, какая кнопка была нажата.Возможно, это не лучшее решение для вашего конкретного приложения (остальная логика этого класса мне не знакома), но суть вы поняли.

Каждое посещение выделенного кода похоже на запуск кода с нуля: между посещениями страницы ничего не настраивается и не сохраняется.

Поэтому, когда вы нажимаете вторую кнопку, noviTest не инициализируется, и поэтому, когда вы пытаетесь вызвать .getID, вы получаете исключение нулевой ссылки.

Чтобы справиться с этим, вам необходимо убедиться, что noviTest инициализирован.Если вы хотите, чтобы он сохранялся между посещениями страницы, вам необходимо использовать какой-то механизм для сохранения или воссоздания экземпляра.Чтобы сохранить его, вы (вероятно) будете использовать session.Для воссоздания вы должны использовать данные сеанса или представления для сохранения значения ключа, которое затем позволит вам получить состояние объекта из какого-либо хранилища.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top