Пустая ссылка исключение при доступе к свойству в OnClick - PullRequest
1 голос
/ 24 апреля 2010

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

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

Когда пользователь щелкает по нему - он запускает MyClass (его реализация находится в каталоге AppCode) и становится невидимым (button2 становится видимым).

Когда я нажимаю кнопку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
    }
}

Ответы [ 3 ]

5 голосов
/ 24 апреля 2010

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

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

ViewState("noviTest") = noviTest;

Затем в Button2_Click:

var noviTest = ViewState("noviTest");
1 голос
/ 24 апреля 2010

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

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

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

1 голос
/ 24 апреля 2010

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 для каждого запроса страницы, независимо от того, какая кнопка была нажата. Возможно, это не лучшее решение для вашего конкретного приложения (я не знаком с остальной логикой этого класса), но вы поняли идею.

...