Ich habe eine Seite:
<%@ Page Inherits="System.Web.Mvc.View<DTOSearchResults>" %>
Und darauf folgendes:
<% Html.RenderPartial("TaskList", Model.Tasks); %>
Hier ist das DTO-Objekt:
public class DTOSearchResults
{
public string SearchTerm { get; set; }
public IEnumerable<Task> Tasks { get; set; }
und hier ist der Teil:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IEnumerable<Task>>" %>
Wenn Model.Tasks nicht null ist, funktioniert alles einwandfrei. Wenn es jedoch null ist, bekomme ich:
Das an das Wörterbuch übergebene Modellelement ist vom Typ 'DTOSearchResults', für dieses Wörterbuch ist jedoch ein Modellelement vom Typ 'System.Collections.Generic.IEnumerable`1 [Task]' erforderlich.
Ich dachte, es muss nicht wissen, welche Überladung verwendet werden soll, also habe ich dies (siehe unten) getan, um es explizit zu machen, aber ich bekomme immer noch das gleiche Problem!
<% Html.RenderPartial("TaskList", (object)Model.Tasks, null); %>
Ich weiß, dass ich das umgehen kann, indem ich nach Null suche oder nicht einmal Null übergebe, aber das ist nicht der Punkt. Warum passiert dies?
quelle
Die Antwort von @ myandmycode ist gut, aber eine etwas kürzere wäre
Dies funktioniert, weil das
ViewDataDictionary
Modell das Modell enthält und ein Modell als Konstruktorparameter akzeptiert werden kann. Dies übergibt grundsätzlich ein "gesamtes" Ansichtsdatenwörterbuch, das natürlich nur das möglicherweise Null-Modell enthält.quelle
new ViewDataDictionary(null)
? Denn das würde eine andere Überladung auswählen, eine mit einemViewDataDictionary
Parameter, der wahrscheinlich keine Nullen akzeptieren würde.null
, entspricht dies dem Aufrufnew ViewDataDictionary(null)
, wodurch die spezifischste Überladung aufgerufen wird.Html.RenderPartial("TaskList", new ViewDataDictionary(model: Model.Tasks))
Sie verwenden den falschen Konstruktor, wenn er null ist.Es scheint, dass MVC absichtlich zum "übergeordneten" Modell zurückkehrt, wenn die Eigenschaft des Modells, das Sie übergeben, null ist. Anscheinend interpretiert die MVC-Engine einen Nullmodellwert als Absicht, den vorherigen zu verwenden.
Etwas mehr Details hier: ASP.NET MVC, stark typisierte Ansichten, Fehler bei Teilansichtsparametern
quelle
Wenn Sie Ihre vorherigen ViewData nicht in der Teilansicht verlieren möchten, können Sie Folgendes versuchen:
quelle
Eine Lösung wäre, einen HtmlHelper wie folgt zu erstellen:
Das
Partial<T>(...)
stimmte vor demPartial(...)
so bequemen und kein Mehrdeutigkeitsfehler beim Kompilieren überein .Persönlich fällt es mir schwer, das Verhalten zu verstehen - scheint es schwer vorstellbar, dass dies eine Designentscheidung ist?
quelle
Obwohl dies beantwortet wurde, bin ich darauf gestoßen und habe beschlossen, dieses Problem für mein Projekt zu lösen, anstatt es zu umgehen
new ViewDataDictionary()
.Ich habe eine Reihe von Erweiterungsmethoden erstellt: https://github.com/q42jaap/PartialMagic.Mvc/blob/master/PartialMagic.Mvc/PartialExtensions.cs
Ich habe auch einige Methoden hinzugefügt, die den Teil nicht aufrufen, wenn das Modell null ist Dies spart eine Menge if-Anweisungen.
Ich habe sie für Razor erstellt, aber einige von ihnen sollten auch mit Ansichten im Aspx-Stil funktionieren (diejenigen, die HelperResult verwenden, sind wahrscheinlich nicht kompatibel).
Die Erweiterungsmethoden sehen folgendermaßen aus:
Es gibt auch Methoden für
IEnumerable<object>
Modelle, und die verworfenen können auch mit einem Razor-Lambda aufgerufen werden, mit dem Sie das Teilergebnis mit etwas HTML umschließen können.Fühlen Sie sich frei, sie zu verwenden, wenn Sie möchten.
quelle
Meine Problemumgehung hierfür ist:
quelle