2015-06-10 15 views
6

Ich bin neu in C# und besonders in ASP.NET MVC.RedirectToAction zu einem anderen Controller und Übergabe von Parametern

Ich habe meine Homecontroller, die diese Methode enthält:

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

Jetzt habe ich einen anderen Controller, der die folgende Zeile im Inneren haben:

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

Wie Sie vielleicht bemerkt, ich bin versuchen, ein Error-Objekt an den anderen Controller zu übergeben, der es dann an die Ansicht übergeben sollte.

Die Fehlerklasse I auf meinem eigenen geschrieben habe, nichts Spektakuläres:

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

Mein Problem ist, dass jedes Mal, wenn ich versuche, den Fehler Variable im Homecontroller zugreifen zu können, ist es null. Ich habe bereits ein paar Einträge gegoogelt, aber ich verstehe nicht, warum mein Code nicht funktioniert. Es gibt keine Fehler, nur dieses Nullwertobjekt. Ich schätze jede Hilfe! :)

+0

Da Sie auf alle Eigenschaften 'privaten Set' haben (die' DefaultModelBinder' können die Eigenschaften nicht festgelegt Und Sie brauchen auch –

+0

einen Parameter losen Konstruktor enthalten Sind Sie. sicher, dass Sie ein [serialisiertes Objekt] übergeben können (http://stackoverflow.com/questions/7597863/passing-object-in-redirecttoaction) – lloyd

Antwort

6

Die DefaultModelBinder kann eine Instanz oder Ihre Error-Klasse basierend auf den Abfragezeichenfolgenparametern nicht initialisieren, da Sie für alle Ihre Eigenschaften haben.

sollte Ihr Modell sein

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

Sie auch

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

und löschen die beiden Konstrukteure

+0

Vielen Dank für Sie Antwort! Ich habe die 'private' Anweisungen entfernt und einen parameterlosen Konstruktor hinzugefügt, aber wenn ich versuche, auf den Parameter in' HomeControllers 'Fehler (Fehler Fehler)' Methode zuzugreifen, bekomme ich immer noch eine Ausnahme. Ich trirre 'String test = error.name; '... tust du Hast du noch andere Ideen? Danke bis hier :) – Ba5t14n

+0

Welche Ausnahme? –

+0

Eine 'NullReferenceException' wird in die Zeile geworfen, weil die' error' Variable 'null' ist. – Ba5t14n

0

Verwenden Sie "Fehler" in Kleinbuchstaben, wenn Sie den anonymen Parameter benennen.

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

Ich glaube, dass die Parameter mit Namen übergeben werden, und jetzt kann er nicht verknüpfen „Fehler“ zu Parameternamen Ihrer Methode.

+0

Te 'DefaultModelBinder' ist nicht Groß-und Kleinschreibung - das macht überhaupt keinen Unterschied –

0

Sie passieren kann komplexe Objekte in einer URL wie das verwenden können. Sie müssen seine Bestandteile senden:

public ActionResult YourAction() 
{ 

    // Here user object with updated data 

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

Natürlich können Sie komplexe Objekte übergeben (nur solange ihre Eigenschaften Werttypen sind - welche OP's sind) –

+0

Das funktioniert gut - danke! Aber jetzt verstehe ich nicht, wie der Compiler weiß, dass er ein Error-Objekt erstellen muss - "sieht" er in der HomeControllers-Methode? – Ba5t14n

Verwandte Themen