Was ich sehe, ist eine String-Layout-Eigenschaft. Aber wie kann ich ein Modell explizit an das Layout übergeben?
c#
.net
asp.net-mvc
razor
SiberianGuy
quelle
quelle
Model
ist verfügbar in_Layout
. Ich benutze MVC5.Antworten:
Scheint, als hätten Sie Ihre Ansichtsmodelle etwas falsch modelliert, wenn Sie dieses Problem haben.
Persönlich würde ich niemals eine Layoutseite eingeben. Wenn Sie dies jedoch tun möchten, sollten Sie ein Basisansichtsmodell haben, von dem Ihre anderen Ansichtsmodelle erben, und Ihr Layout in das Basisansichtsmodell eingeben und Ihre Seiten einmal in das spezifische.
quelle
Beispiel: Controller:
Beispiel oben auf der Layoutseite
Jetzt können Sie auf die Variable 'viewModel' auf Ihrer Layoutseite mit vollem Zugriff auf das eingegebene Objekt verweisen.
Ich mag diesen Ansatz, weil es der Controller ist, der das Layout steuert, während die einzelnen Seitenansichtsmodelle layoutunabhängig bleiben.
Hinweise für MVC Core
Mvc Core scheint den Inhalt von ViewData / ViewBag beim ersten Aufruf jeder Aktion wegzublasen. Dies bedeutet, dass das Zuweisen von ViewData im Konstruktor nicht funktioniert. Was jedoch funktioniert, ist die Verwendung von
IActionFilter
und genau die gleiche Arbeit inOnActionExecuting
. ZiehMyActionFilter
deine anMyController
.quelle
Dies ist ziemlich grundlegend. Alles, was Sie tun müssen, ist, ein Basisansichtsmodell zu erstellen und sicherzustellen, dass ALLE! und ich meine ALL! Von Ihren Ansichten, die jemals dieses Layout verwenden werden, erhalten Sie Ansichten, die dieses Basismodell verwenden!
in der _Layout.cshtml:
in der Index-Methode (zum Beispiel) im Home-Controller:
die Index.cshtml:
Ich bin nicht der Meinung, dass das Übergeben eines Modells an das _layout ein Fehler ist. Einige Benutzerinformationen können übergeben werden und die Daten können in die Vererbungskette des Controllers eingetragen werden, sodass nur eine Implementierung erforderlich ist.
Für fortgeschrittenere Zwecke sollten Sie natürlich in Betracht ziehen, einen benutzerdefinierten statischen Kontraxt mithilfe von Injection zu erstellen und diesen Modell-Namespace in die Datei _Layout.cshtml aufzunehmen.
Aber für einfache Benutzer reicht dies aus
quelle
Eine übliche Lösung besteht darin, ein Basisansichtsmodell zu erstellen, das die in der Layoutdatei verwendeten Eigenschaften enthält, und dann vom Basismodell an die auf den jeweiligen Seiten verwendeten Modelle zu erben.
Das Problem bei diesem Ansatz ist, dass Sie sich jetzt auf das Problem eines Modells festgelegt haben, das nur von einer anderen Klasse erben kann, und Ihre Lösung möglicherweise so ist, dass Sie die Vererbung für das von Ihnen beabsichtigte Modell sowieso nicht verwenden können.
Meine Lösung beginnt auch mit einem Basisansichtsmodell:
Was ich dann benutze, ist eine generische Version des LayoutModels, die vom LayoutModel erbt, wie folgt:
Mit dieser Lösung habe ich die Notwendigkeit einer Vererbung zwischen dem Layoutmodell und dem Modell getrennt.
Jetzt kann ich das LayoutModel in Layout.cshtml folgendermaßen verwenden:
Und auf einer Seite können Sie das generische LayoutModel wie folgt verwenden:
Von Ihrem Controller geben Sie einfach ein Modell vom Typ LayoutModel zurück:
quelle
Warum fügen Sie nicht einfach eine neue Teilansicht hinzu, wobei i's spezifischer Controller das erforderliche Modell an die Teilansicht übergibt und schließlich die erwähnte Teilansicht in Ihrer Layout.cshtml mit RenderPartial oder RenderAction rendert?
Ich benutze diese Methode, um die angemeldeten Benutzerinformationen wie Name, Profilbild usw. anzuzeigen.
quelle
alte Frage, aber nur um die Lösung für MVC5-Entwickler zu erwähnen, können Sie die verwenden
Model
Eigenschaft wie in der Ansicht verwenden.Die
Model
Eigenschaft in Ansicht und Layout ist demselbenViewDataDictionary
Objekt zugeordnet, sodass Sie keine zusätzlichen Arbeiten ausführen müssen, um Ihr Modell an die Layoutseite zu übergeben, und Sie müssen nicht@model MyModelName
im Layout deklarieren .@Model.XXX
Beachten Sie jedoch, dass bei Verwendung im Layout das IntelliSense-Kontextmenü nicht angezeigt wird, da es sichModel
hier um ein dynamisches Objekt handeltViewBag
.quelle
Vielleicht ist es technisch nicht die richtige Art, damit umzugehen, aber die einfachste und vernünftigste Lösung für mich besteht darin, einfach eine Klasse zu erstellen und sie im Layout zu instanziieren. Dies ist eine einmalige Ausnahme von der ansonsten korrekten Vorgehensweise. Wenn dies mehr als im Layout erfolgt, müssen Sie Ihre Arbeitsweise ernsthaft überdenken und möglicherweise einige weitere Tutorials lesen, bevor Sie mit Ihrem Projekt fortfahren.
dann in der Ansicht
In .net Core können Sie dies sogar überspringen und die Abhängigkeitsinjektion verwenden.
Es ist einer dieser Bereiche, der etwas schattig ist. Aber angesichts der extrem komplizierten Alternativen, die ich hier sehe, denke ich, dass es mehr als eine gute Ausnahme ist, im Namen der Praktikabilität zu machen. Besonders wenn Sie sicherstellen, dass es einfach bleibt und dass jede schwere Logik (ich würde argumentieren, dass es eigentlich keine geben sollte, aber die Anforderungen unterschiedlich sind) in einer anderen Klasse / Schicht liegt, zu der sie gehört. Es ist sicherlich besser, als ALLE Ihre Controller oder Modelle zu verschmutzen, um im Grunde nur eine Ansicht zu erhalten.
quelle
Es gibt eine andere Möglichkeit, es zu archivieren.
Implementieren Sie einfach die BaseController-Klasse für alle Controller .
BaseController
Erstellen Sie in der Klasse eine Methode, die beispielsweise eine Model-Klasse zurückgibt.Layout
Seite können Sie diese Methode aufrufenGetTopMenu()
quelle
Angenommen, Ihr Modell ist eine Sammlung von Objekten (oder möglicherweise ein einzelnes Objekt). Führen Sie für jedes Objekt im Modell die folgenden Schritte aus.
1) Legen Sie das Objekt, das Sie anzeigen möchten, in den ViewBag. Beispielsweise:
2) Fügen Sie oben in _Layout.cshtml eine using-Anweisung hinzu, die die Klassendefinition für Ihre Objekte enthält. Beispielsweise:
@ using YourApplication.YourClasses;
3) Wenn Sie in _Layout auf Ihr Objekt verweisen, besetzen Sie es. Sie können die Besetzung aufgrund dessen anwenden, was Sie in (2) getan haben.
quelle
Verwenden Sie IContainsMyModel in Ihrem Layout.
Gelöst. Schnittstellenregel.
quelle
Beispielsweise
Lesen Sie mehr über die neue @ model- Direktive
quelle