2010-11-19 7 views
1

ich wirklich diesen neuen Razor Ansicht Motor ... jemand am Graben Für nur von einer anderen Web-Plattform zu Hause der neuen MVC 3 Bemühungen für mich zu fühlen beginnen, kommt ...Razor Ansicht Motor RenderSection

Meine Frage Es geht um Abschnitte, ich sehe, dass es möglich ist, Abschnitte in Ihrem Layout zu definieren und Inhalt in sie zu injizieren, aber von allen Samples, die ich gesehen habe, scheint es, dass dies aus der Ansicht heraus geschieht. Für mich ist es sinnvoller, Inhalte oder Ausgaben für jeden Abschnitt vom Controller aus zuzuweisen.

Wenn ich also ein Layout habe, das eine Seitenleiste enthält, die ich Widgets in meine Ansichtsdatei laden möchte, sollte nicht für das Rendern des Inhalts in diese Abschnitte verantwortlich sein. Wenn dies der Fall wäre, müsste der Code für die Seitenleiste über mehrere Ansichten hinweg geteilt werden, dann müsste ich diesen Code über Ansichtsdateien duplizieren. Meine Ansichtsdateien sollten nicht wissen, welcher Inhalt in der nebenstehenden Seitenleiste angezeigt wird.

Idealerweise möchte ich meinen Abschnitten in der Seitenleiste von meinem Controller aus Inhalte zuordnen, also meine Frage, ist das möglich?

+2

Warum sollte es sinnvoller sein, dies vom Controller aus zu tun? Controller sollen im Allgemeinen keine View-Logik haben; Sie sind nur dafür verantwortlich, eine Ansicht auszuwählen und ihr ein Modell zu geben. – Aaronaught

+0

Warum erstellen Sie keine Teilansicht und verwenden diese in den Ansichten wie erforderlich? – timothyclifford

+0

Controller haben View-Logik, wenn Sie darüber nachdenken, sie initiieren das Ansichtsmodell, weisen in einigen Fällen Werte zu und rufen dann die entsprechende Ansicht auf, die es verwendet. Das gleiche sollte für Abschnitte getan werden. – JBeckton

Antwort

1

In ASP.NET MVC (und anderen MVC-basierten Webanwendungsarchitekturen) bereiten Controller die Daten vor, die von den Ansichten gerendert werden. Wie, wo und vielleicht sogar wenn diese Daten gerendert werden, ist der Job der Ansicht herauszufinden. Dies ist natürlich eher eine architektonische Diskussion.

Eine nette Sache über ASP.NET MVC ist ihre "Konvention über Konfiguration" Standpunkt, die (insbesondere mit Razor) können Sie ändern, wie sich viele Dinge verhalten. Ich glaube nicht, dass es eine View.Sections["section1"] = <some data>; Option gibt, aber Sie könnten ein ViewModel erstellen, das auf Abschnitten basiert, dann haben Sie eine generische Masteransicht, die dieses ViewModel einfach auseinander nimmt und die korrekten Daten sendet, um Teilansichten zu korrigieren. Dieses Ansichtsmodell für Abschnitte könnte sogar HTML enthalten, das gerendert werden muss, da Razor verwendet werden kann, um HTML außerhalb von .cshtml-Dateien zu rendern. Weitere Informationen finden Sie im Blog von Andrew Nures: http://blog.andrewnurse.net/

Wie Sie sehen können, überträgt dies eine Menge Verantwortung von der Sicht auf die Controller. Ich selbst mag, dass das Rendering völlig von den Controllern getrennt ist, denn dann kann ich hypothetisch sehr unterschiedliche Websites erstellen, indem ich einfach die Art und Weise ändere, wie Daten gerendert werden.

+0

Ich benutze Ansichtsmodelle und ich verstehe nicht, wie man eine Ansicht über mehrere Aktionen hinweg verwendet, während ein Ansichtsmodell verwendet wird. Basierend auf dem, was Sie sagen, müsste ich entweder den gleichen Code über mehrere Ansichtsseiten kopieren oder dieselbe Ansichtsseite für mehrere Aktionen verwenden. Oder möglicherweise Code für jede Ansicht über das Ansichtsmodell kopieren.Ich kaufe nicht die Idee, dass ich Code in meiner Sicht "möglicherweise Geschäftslogik" setzen sollte, der entscheidet, was wann und wo für eine bestimmte Ansicht gerendert wird. – JBeckton

+0

Wenn ich Module oder Widgets zuweisen wollte, um in bestimmten Abschnitten auf einer Seite auszugeben, wo die Entscheidung, was rendert, in welchem ​​Abschnitt in einer Datentabelle ist, würde ich diese Entscheidungen aus Code meiner Ansicht nach nicht verarbeiten. – JBeckton

+1

Es gibt einige Möglichkeiten, wie Sie die Verantwortung einer Ansicht auf ihren Inhalt aufteilen können. Die Html.Action (...) kann verwendet werden, um den Code einer anderen in der aktuellen Ansicht wiedergegebenen Aktion zu erhalten. In der Ansicht, die diese Aktion über den Status Ihrer App informiert, müssten Sie wahrscheinlich noch eine minimale Logik ausführen. Aber Sie könnten das natürlich vorberechnen und einfach auf Fahnen köcheln lassen. Aber wie gesagt, versuchen Sie den Blogpost von Andrew Nurse über die Verwendung von Razor außerhalb von ASP.NET anzuschauen und es könnte Ihnen einige Ideen geben. – gligoran