2015-06-10 6 views
6

Sono nuovo in C# e in modo esponenziale in ASP.NET MVC.RedirectToAction su un altro controller e parametri di passaggio

ho il mio HomeController, che contiene questo metodo:

public ActionResult Error(Error error) 
{ 
    return View(error); 
} 

Ora ho un altro controller, che hanno la seguente riga all'interno:

return RedirectToAction("Error","Home", new { Error = (new Error("ErrorName","ErrorDescription"))}); 

Come si può notare, sono cercando di passare un oggetto Error all'altro controller, che quindi dovrebbe passarlo alla vista.

La classe Error ho scritto da solo, niente di spettacolare:

public class Error 
{ 
    public String name { get; private set; } 
    public String description { get; private set; } 
    public int number { get; private set; } 

    public Error(String name, String description) 
    { 
     this.name = name; 
     this.description = description; 
     number = 0; 
    } 
} 

Il mio problema ist che ogni volta che tenta di accedere alla variabile errore nel HomeController, è null. Ho già trovato su Google alcuni post, ma non capisco, perché il mio codice non funziona. Non ci sono errori, solo questo oggetto valore nullo .. Apprezzo qualsiasi aiuto! :)

+0

Perché hai 'set' privata su tutte le proprietà (il' DefaultModelBinder' non può impostare le proprietà e anche necessario includere un costruttore senza parametri –

+0

Sei. sicuro che si può passare un [oggetto serializzato] (http://stackoverflow.com/questions/7597863/passing-object-in-redirecttoaction) – lloyd

risposta

6

DefaultModelBinder Impossibile inizializzare un'istanza o la classe Error in base ai parametri della stringa di query poiché si dispone di private set su tutte le proprietà.

Il modello dovrebbe essere

public class Error 
{ 
    public String name { get; set; } 
    public String description { get; set; } 
    public int number { get; set; } 

    public Error() // you must add a parameter-less constructor 
    { 
    } 

    public Error(String name, String description) 
    { 
    this.name = name; 
    this.description = description; 
    // number = 0; // no need for this - the default is 0 
    } 
} 

È inoltre possibile utilizzare

return RedirectToAction("Error","Home", new { name = "ErrorName", description = "ErrorDescription"}); 

ed eliminare entrambi i costruttori

+0

Grazie per voi Ho rimosso le istruzioni 'private' e ho aggiunto un costruttore senza parametri, ma quando provo ad accedere al parametro nel metodo' HomeController' Error (Error error) ', ottengo comunque un'eccezione I trird' String test = error.name; '... fai tu hai altre idee? Grazie fino a qui :) – Ba5t14n

+0

Quale eccezione? –

+0

Un 'NullReferenceException' è gettato nella linea, perché la variabile' error' è 'null' – Ba5t14n

0

Prova con "errore" in minuscolo quando è il nome del parametro anonimo.

return RedirectToAction("Error","Home", new { error = (new Error("ErrorName","ErrorDescription"))}); 

Credo che i parametri vengono passati per nome, e ora non si può creare un collegamento "Errore" per nome del parametro del metodo.

+0

te 'DefaultModelBinder' non è case sensitive - questo fa alcuna differenza a tutti i –

0

Non è possibile passare oggetti complessi in un URL del genere. Si dovrà inviare i suoi elementi costitutivi:

public ActionResult YourAction() 
{ 

    // Here user object with updated data 

    return RedirectToAction("Error","Home", new { 
     name = "ErrorName", 
     description = "ErrorDescription", 
     number = 0 
    }); 
} 
+0

Ovviamente puoi passare oggetti complessi (basta che le loro proprietà siano tipi di valore - quali OP sono) –

+0

Questo funziona bene - grazie! Ma ora non capisco come il compilatore sappia che deve creare un oggetto Error - "guarda" nel metodo HomeControllers? – Ba5t14n