Verwenden von MVC 3 mit Razor View Engine. Ich habe diese Ansicht:
@model dynamic
@{
var products = (List<ListItemBaseModel>)Model.Products;
var threshold = (int)(Model.Threshold ?? 1);
var id = Guid.NewGuid().ToString();
}
Es wird aus einer anderen Ansicht mit diesem Code aufgerufen:
@Html.Partial("PartialViewName", new { Products = Model, Threshold = 5 })
In beiden Ansichten scheint es, wenn ich sie debugge und Model beobachte, das richtige Objekt zu enthalten. Wenn ich den Code ausführe, wird in der Zeile "var products =" ein Fehler angezeigt, der besagt:
'Objekt' enthält keine Definition für 'Produkte'
Kann mir jemand erklären, warum ich diesen Fehler bekomme? Wenn ich das Model-Objekt im Debugging-Modus betrachte, sieht es wieder in Ordnung aus (mit zwei Eigenschaften: Produkte und Schwellenwert)
asp.net-mvc-3
razor
Ruud van Falier
quelle
quelle
Antworten:
Übergeben Sie eine Instanz einer anonymen Klasse als Ansichtsmodell? Ich habe es gerade versucht (dynamisches Ansichtsmodell in CSHTML) und habe den gleichen Fehler wie bei der Verwendung einer anonymen Klasse erhalten, aber es hat gut funktioniert, wenn ich eine benannte Klasse erstellt habe. Ich habe gesucht, aber nirgendwo dokumentiert.
EDIT # 1:
Laut David Ebbo können Sie einen anonymen Typ nicht an eine dynamisch typisierte Ansicht übergeben, da die anonymen Typen als kompiliert werden
internal
. Da die CSHTML-Ansicht in einer separaten Assembly kompiliert wird, kann sie nicht auf die Eigenschaften des anonymen Typs zugreifen.EDIT # 2:
David Ebbo hat seinen Beitrag mit folgender Klarstellung bearbeitet:
quelle
return View(new { Foo = 1, Bar = "test" });
? Weil ich MVC 4 benutze und immer noch "Objekt enthält keine Definition für Foo" bekommeToExpando
einen)Unter .NET 4.0 können anonyme Typen problemlos in ExpandoObjects konvertiert werden, sodass alle Probleme mit dem Overhead der Konvertierung selbst behoben werden. Hier geht es raus
quelle
Dies hat nichts mit anonymen Typen mit internen Eigenschaften zu tun
Es ist durchaus möglich , anonyme Typen von einer Ansicht an eine Teilansicht zu übergeben
Ich bin heute auf dasselbe Problem gestoßen, und es hatte nichts (direkt) mit dem Problem zu tun, anonyme Typen und ihre inhärenten
internal
Eigenschaften zu übergeben.In Bezug auf die OP-Frage ist die Antwort von @Lucas daher irrelevant - auch wenn die Problemumgehung funktioniert .
In der OP-Frage wird ein anonymer Typ von einer Ansicht in Baugruppe X an einen Teil in Baugruppe X übergeben . Daher ist das von David Ebbo skizzierte Problem, dass die Eigenschaften für anonyme Typen intern sind, ohne Bedeutung. Die für die Ansicht kompilierten Typen, der partielle und der anonyme Typ sind alle in derselben Assembly enthalten .
Was verursacht also das plötzliche Versagen, einen anonymen Typ von einer Ansicht an einen Teil zu übergeben?
Zumindest in meiner Situation stellte ich fest, dass es an einer anderen Ansicht im GLEICHEN ORDNER lag, die einen Modelltyp angibt, der nicht aufgelöst werden kann . Ansichten werden zur Laufzeit kompiliert, und daher wäre es sinnvoll, wenn ein Fehler zur Laufzeit beim Kompilieren der Ansichten auch einen Fehler beim Kompilieren der dynamischen Typen bedeuten würde und der Teil einfach eine erhalten würde
object
. Es ist nicht sofort klar, was los ist, aber im spezifischen Beispiel des OP (und meinem) ist dies höchstwahrscheinlich die Ursache des Problems.Es ist interessant festzustellen, dass anonyme Typen nicht in gleicher Weise betroffen sind, wenn der Modelltyp korrekt ist, ein anderer Teil der Ansicht jedoch nicht kompiliert wird. Dies muss darauf zurückzuführen sein, wie Razor die dynamische Kompilierung der Bestandteile der Ansicht aufteilt.
Wenn Sie die fehlerhafte Ansicht korrigiert haben, erstellen Sie entweder die gesamte Lösung neu oder bereinigen und erstellen Sie das Projekt neu, bevor Sie überprüfen, ob es behoben ist.
Um sicherzustellen, dass Sie nicht erneut davon betroffen sind, können Sie die Kompilierungszeitkompilierung Ihrer Razor-Ansichten aktivieren, indem Sie dies Ihrer
csproj
Datei hinzufügen :quelle
Fügen Sie die folgende Klasse an einer beliebigen Stelle in Ihrer Lösung hinzu (verwenden Sie den System-Namespace, damit Sie sie verwenden können, ohne Referenzen hinzufügen zu müssen) -
Wenn Sie das Modell an die Ansicht senden, konvertieren Sie es in Expando:
quelle
Anstatt den
dynamic
Modelltyp in der Teilansicht zu verwenden.Sie können die anonymen Objektattribute mit
@ViewData.Eval("foo")
anstelle von aufrufen@Model.foo
.Dann können Sie
@Model dynamic
aus der Ansicht entfernen .Ich bin kürzlich auf dieses Problem gestoßen, als ich einige Attribute zwischen Ansichten für die Integration von sozialen Kommentaren auf Facebook übergeben habe. Beispielcode:
Dann hatte ich aus meiner Sicht gerade diese Div:
quelle
Ich bin nicht sicher, ob Sie diesen Fehler erhalten, weil Sie die Problemumgehung nicht implementieren. Ich habe den gleichen Fehler in einer Teilansicht. Die Lösung bestand nur darin, den Build zu bereinigen und neu zu erstellen. Wenn die Syntax korrekt ist, sollte der Code funktionieren, aber die Razor Engine aktualisiert die Codeänderungen möglicherweise nicht richtig.
quelle
Ich habe dieses Problem mithilfe eines Wörterbuchs umgangen.
quelle
Um
dynamic
type zu verwenden, müssen Sie aufMicrosoft.CSharp
Assembly verweisenquelle