2013-05-10 7 views
33
@model Customer 

@Html.Partial("_UserProfile", (UserProfile)Model.UserProfile) 

Wenn ich diesen Code ausführen, bekomme ich diesen Fehler:(PartialView) Das Modellelement in das Wörterbuch übergeben ist vom Typ ‚Kunden‘, aber dieses Wörterbuch erfordert ein Modell Artikel des Typs ‚Userprofile‘

The model item passed into the dictionary is of type 'Customer', but this dictionary requires a model item of type 'UserProfile'. 

Teilansicht _UserProfile ist stark typisiert.

Ich möchte in der Lage sein, diese Felder zu bearbeiten. Irgendwelche Vorschläge?

+0

Überprüfen Sie auch den Unterschied zwischen Html.Action und Html.Partial ist nützlich https://StackOverflow.com/questions/16886585/html-partial-skips-the-controller-action –

Antwort

72

Stellen Sie sicher, dass Model.UserProfile nicht null ist.

Ich fand Ihren Beitrag, der versucht, den gleichen Fehler zu debuggen, und es stellte sich heraus, dass ich mein "Model.UserProfile" Äquivalent nicht initialisiert hatte.

Ich denke, was passiert hier ist, dass, wenn ein Null-Modell an RenderPartial übergeben wird, verwendet es standardmäßig das Hauptansichtsmodell? Kann das jemand bestätigen?

+18

Sie haben Recht. Dies ist ein Überlastungsproblem. Wenn Sie versuchen, '@ Html.Partial (, )' aufzurufen, während Sie das Modell als 'null' übergeben, wird davon ausgegangen, dass Sie die Methodenversion aufgerufen haben, die nur den Namen der Sicht akzeptiert und das aktuelle Ansichtsmodell an die Teilansicht. – Lafi

+0

Ja, Sie haben Recht! Sie können PropertyThatWasNull = new YourObject() in Ihrem ViewModel-Konstruktor hinzufügen, um dies in den meisten Fällen zu korrigieren. Möglicherweise schwieriger mit einem UserProfile-Objekt null. – jwize

+1

Nasty Bug auf MVC, gerade von dem auch getroffen worden, danke für den Tipp. – Alejandro

-1

Sie versuchen, ein Customer Objekt vom Typ UserProfile zu erfassen. Standardmäßig funktioniert das nicht, da das Framework keine Ahnung hat, wie diese Objekte umgewandelt werden. Wenn Sie unbedingt es auf diese Weise tun, ist die einzige Möglichkeit, wie expliziten Cast-Operator zur Verfügung zu stellen:

public static explicit operator Digit(byte b) // explicit byte to digit conversion operator 
{ 
    Digit d = new Digit(b); // explicit conversion 

    System.Console.WriteLine("Conversion occurred."); 
    return d; 
} 

Sie können here mehr darüber lesen.

+0

Es gibt eine Umwandlung für die Eigenschaft UserProfile. In diesem Fall denke ich, dass es unnötig sein sollte, aber es sieht wie ein expliziter Versuch aus, dem Compiler zu sagen, dass dies der Typ ist, den ich übergebe. – avantprime

-1

Fügen Sie der UserProfile-Eigenschaft des Customer-Modells das Schlüsselwort "virtual" hinzu. Es ist der Weg, um die easyest verzögertes Laden zu überwinden, aber die Leistung ..

18

Wenn Model.UserProfile null ist, wird er versuchen, in Ihrem Kundenmodell zu übergeben.

Zwei Möglichkeiten, dies zu umgehen:

@model Customer 

@Html.Partial("_UserProfile", (UserProfile)Model.UserProfile, new ViewDataDictionary()) 

Oder: wenn übergeben Artikel null ist

@model Customer 

if (Model.UserProfile != null) 
{ 
    @Html.Partial("_UserProfile", (UserProfile)Model.UserProfile) 
} 
+0

Die zweite würde nicht funktionieren, Sie müssten eine defensive Besetzung verwenden: '@ Html.Partial (" _ UserProfile ", Modell als UserProfile)' – Echilon

+0

@Echilon: Sie haben recht, die zweite funktioniert nicht, aber auch nicht Ihr Vorschlag. Die erste Option in der Antwort löst das Problem jedoch. – musefan

+0

Der zweite Teil wurde entworfen, um die Teilansicht zu überspringen, wenn das Modell null ist. In diesem Beispiel ist es möglicherweise nicht sinnvoll, eine UserProfile-Ansicht anzuzeigen, wenn kein Benutzerprofil vorhanden ist. Dadurch wird der Fehler vermieden. – Kcoder

0

Es auf Anfangsmodell Rückfall wird.

Try this:

@Html.Partial("_UserProfile", (UserProfile)Model.UserProfile ?? new UserProfile()) 
1

ich in dieses Problem lief, wenn sie mit Teilen eines Benutzerprofiles wie Name und Adresse Aufzeichnungen handeln. Wenn der Benutzer ein unvollständiges Profil hatte, möchte ich, dass die Kontoverwaltungsansicht einen Nulladresseintrag erkennt und einen Aktionslink zum Erstellen einer neuen Adresse oder zum Anzeigen der verfügbaren Adressdaten anzeigt.

Wie von anderen beschrieben, wenn null übergeben wird, wird die Überladung für Html.RenderPartial ausgelöst und das übergeordnete Ansichtsmodell wird übergeben. Am Ende habe ich meine Teilansichten in Display- und Editor-Templates umgewandelt, um sie zu umgehen.Hier sind einige How-To Artikel aus: Hansleman und codeguru

Sie erhalten eine bessere Wiederverwendbarkeit von dieser Methode und es bewahrt die Nullwerte: Ihrer Ansicht:

@Html.DisplayFor(m=> m.Address) 

Dann den Null-Wert behandeln in das DisplayTemplate.

@model Namespace.Models.MyObject 
... 
if(@Model != null){ 
... 
}else{ 
... 
} 
+1

Von allen Methoden, die wir versuchten, unsere eigene Version dieses Problems zu lösen, war dies bei weitem die beste. ViewData und ModelState (einschließlich ModelState-Fehler usw.) werden alle damit normal übergeben. Die meisten anderen Lösungen übergeben ein neues ViewData-Objekt, das einen beliebigen ModelState zerlegt. – mikeschuld

+0

Genau @mikeschuld Warum möchtest du die Fehlerbehandlung zerquetschen und ein neues Objekt werfen, obwohl dein Modell tatsächlich null ist? Behandeln Sie einfach den Zustand, in dem es gehandhabt werden soll. Fairerweise beantwortete ich nicht die Frage, wie Html zu verwenden war. Teilweise habe ich gerade gesagt, benutze es nicht, wenn dein Objekt null sein könnte. – reachingnexus

0

Ich habe das gleiche Problem konfrontiert, aber schließlich hatte ich es herausgefunden. Es gibt einen Typkonflikt in bestandenen Modellen .. Ihre Ansicht akzeptiert Modell des Typs Customer, aber Sie Teilansicht ist das Modell übergeben Userprofile so, was Sie tun müssen, ist das gleiche Modell in beiden oder .... ein Modell, das haben alle Eigenschaften beider Modelle. Sicherlich wird Ihr Problem gelöst sein.

Verwandte Themen