Domanda

Ti prego, aiutami a capire cosa c'è di sbagliato in questo codice:

Ho pagina ASP.NET con un pulsante visibile.

Quando l'utente fa clic - è istanze MyClass (la sua attuazione si trova nella directory AppCode) e si rende invisibile (button2 diventa visibile).

Quando clicco Button2 solleva "riferimento oggetto non impostato su un'istanza di un oggetto" Exception.

Quello che sembra essere il problema?

{
    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
    }
}
È stato utile?

Soluzione

Poiché il postback il noviTest riferimento MyClass non viene ricreata.

È possibile aggiungere al ViewState per mantenere un riferimento ad esso. (Supponendo MyClass è serializzabile).
In Button1_Click:

ViewState("noviTest") = noviTest;

Poi nel Button2_Click:

var noviTest = ViewState("noviTest");

Altri suggerimenti

noviTest è nullo Button2_Click all'interno.

provare qualcosa di simile:

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;
}

Questa causa noviTest volontà di un'istanza ad ogni richiesta di pagina, a prescindere da quale pulsante è stato cliccato. Questo potrebbe non essere la soluzione migliore per una particolare applicazione (Sono familiarità con il resto della logica in questa classe), ma si ottiene l'idea.

Ogni visita al code-behind è un po 'come l'esecuzione del codice da zero, nulla è impostato o conservati per voi tra le visite alla pagina.

Quindi, quando si preme il secondo pulsante noviTest non viene inizializzato e quindi quando si tenta di chiamare .getID per ottenere un'eccezione di riferimento null.

Per far fronte a questo è necessario per garantire che noviTest è inizializzata. Se si vuole avere persistente tra le visite alla pagina è necessario utilizzare un meccanismo a uno negozio o ricreare l'istanza. Per conservarlo si farebbe (probabilmente) sessione di utilizzo. Per ricreare si usa sia di sessione o viewdata a persistere un valore chiave che avrebbe quindi consentire di recuperare lo stato dell'oggetto dallo stoccaggio di qualche tipo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top