Verständnis von ViewData
in ASP.NET MVC Benutzersteuerelementen
Bei der Arbeit mit ASP.NET MVC stoßen Entwickler häufig auf Situationen, in denen sie Daten effektiv an Ansichten und Benutzersteuerelemente übergeben müssen. Eine häufige Frage taucht auf, wenn versucht wird, auf Daten in einem Benutzersteuerelement über die ViewData
-Sammlung zuzugreifen. In diesem Blogbeitrag werden wir das Problem untersuchen, warum bestimmte Eigenschaften möglicherweise nicht in ViewData
erscheinen und wie man dies angemessen löst.
Das Problem: Zugriff auf ViewData
in Benutzersteuerelementen
Stellen Sie sich vor, Sie haben ein Benutzersteuerelement erstellt und versuchen, eine Nachricht aus einem Modell mithilfe der ViewData
-Sammlung darzustellen. In Ihrem Controller könnten Sie Folgendes schreiben:
return View("Message", new { DisplayMessage = "Dies ist ein Test" });
Dann versuchen Sie, auf diese Daten in Ihrem Benutzersteuerelement mit folgendem Code zuzugreifen:
<%= ViewData["DisplayMessage"] %>
Statt der erwarteten Nachricht erhalten Sie jedoch einen null
-Wert. Dies kann frustrierend sein und viele Entwickler dazu bringen zu fragen: Warum wird die Eigenschaft DisplayMessage
nicht der ViewData
-Sammlung hinzugefügt?
Verhalten von ViewData
verstehen
Die ViewData
-Sammlung ist dazu gedacht, Schlüssel-Wert-Paare zu halten. In einem typischen Szenario, in dem Sie ein anonymes Objekt an eine Ansicht übergeben, füllen die Eigenschaften dieses Objekts nicht automatisch das ViewData
-Wörterbuch. Dieses Verhalten ist absichtlich; das bedeutet, dass Ihre Ansicht zwar direkt auf die Eigenschaften des Modells zugreifen kann, ViewData
jedoch nicht unbedingt mit diesen Eigenschaften gefüllt wird, es sei denn, es ist stark typisiert.
Warum ist das der Fall?
- Anonyme Typen: Wenn Sie ein anonymes Objekt verwenden (wie in unserem Beispiel), werden dessen Eigenschaften nicht in der
ViewData
-Sammlung gespeichert. - Starke Typisierung erforderlich: Um den Zugriff auf Eigenschaften zu vereinfachen, ist es vorteilhaft, ein stark typisiertes Modell – wie eine Klasse – zu erstellen.
Die Lösung: Stark typisieren Ihres Benutzersteuerelements
Um Daten in Ihrem Benutzersteuerelement effektiv zu übergeben und abzurufen, können wir eine stark typisierte Klasse verwenden. Beispielsweise können Sie eine Klasse MessageData
erstellen:
public class MessageData
{
public string DisplayMessage { get; set; }
}
Ändern Sie dann Ihr Benutzersteuerelement, um stark typisiert zu sein, wie folgt:
public class MessageControl : ViewUserControl<MessageData>
Jetzt können Sie es von Ihrem Controller aus wie folgt aufrufen:
return View("Message", new MessageData() { DisplayMessage = "Dies ist ein Test" });
Und auf diese Eigenschaft innerhalb des Benutzersteuerelements zugreifen mit:
<%= ViewData.Model.DisplayMessage %>
Alternative Methode
Falls Sie bevorzugen, weiterhin ViewData
zu verwenden und keine stark typisierte Klasse zu erstellen, können Sie den Wert über die Methode ViewData.Eval
abrufen:
ViewData.Eval("DisplayMessage")
Diese Methode sucht die Eigenschaft innerhalb von ViewData
und gibt den Wert zurück, wenn er vorhanden ist.
Fazit
Zusammenfassend lässt sich sagen, dass es verständlich ist, dass man erwartet, ViewData
würde automatisch die Eigenschaften von anonym übergebenen Objekten enthalten, da dies aufgrund der Art und Weise, wie ASP.NET MVC die Daten zwischen Modellen und Ansichten verwaltet, nicht geschieht. Durch die starke Typisierung Ihres Benutzersteuerelements oder die Verwendung von ViewData.Eval
können Sie erfolgreich auf die gewünschten Daten zugreifen.
Das Verständnis dieser Nuancen wird Ihre Codiererfahrung mit ASP.NET MVC effizienter und angenehmer machen. Viel Spaß beim Programmieren!