Frage

Ich beobachtete nur Scott Hanselman Präsentation auf ASP.NET MVC in San Francisco. Nach einigem Nachdenken über sie für eine Weile war ich, wie am besten Ansatz den Aufbau einer ASP.NET MVC-basierte Website stapfte, das eine hat. [Portal | modular | Multi-View] Struktur (wählen Sie Ihren Favoriten Definition)

Um Ihnen eine Vorstellung davon, was ich nach, baut mein Unternehmen eine Menge Portal-Stil-Anwendungen für Kunden aus, die ein Mapping-Modul enthalten, die reagieren können, um es eigene Abfrage-Strings und Routen sind, Steuerpaketinformationsmodul, dass ähnlich hat seine eigene Sicht (en), Dokumenten-Retrieval Ansicht, dass Displays einzelne und mehrere Dokumente ... Sie bekommen die Idee. Der kritische Teil ist, dass jedes Modul wirklich eigenständigen ist. Wenn ein Nutzer nach einem Steuer Datensatz nach Namen könnten sie 10 Ergebnisse sehen ( „John Doe“ besitzt einige Eigenschaften). Jedes Ergebnis hat eine „Karte“ -Link, weil die Website Application Framework weiß, dass es ein Kartenmodul zur Verfügung. Die „Karte“ -Link sendet die richtige Anfrage wie http://myapp.com/taxparcel/map/123443 . Die Kartenmodul-Controller reagiert auf die externe Anforderung durch auf der Karte Zoomen und Hervorhebung der Steuer Paket.

Der Schlüssel zu diesem ganzen Fluss ist, dass beide die Steuer- und Mapping-Module ist auf der Web-Seite.

Wie passt das in die ASP.NET MVC-Box? Partials? Unteransichten? Mehrere Ansichten für einen einzelnen Controller? Wenn ich nur fehle den offensichtlichen Teil der Dokumentation, dann fühlen sich frei, mich öffentlich zu lambast und beinhaltet den Link. Ansonsten bin ich offen für Vorschläge.

War es hilfreich?

Lösung

Nun, Ihre Ansicht Modell Notwendigkeit Erweiterungspunkte bieten. Ich gehe davon aus, dass die Daten für die Ansicht hat diese Modulteile enthalten, und wird von der Steuerung irgendwie aufgenommen:

public ActionResult Search(string text)
{
   var model = seachService.Search(text)
   // here either:
   // 1. model contains .Modules collection and is populated by the service, or
   // 2. controller does
   var viewmodel = new SearchViewModel(model, modulesService.GetModulesFor(model));
   // i.e. it adds modules-specific information to the view data
   return View(model);
}

Nun wird die Module spezifischen Daten von SearchViewModel in etwas umgewandelt werden, dass View verwenden kann:

public interface IModuleSpecificViewPart
{
  public IList<string> GetAdditionalLinksForUser();
  public void RenderAdditionalInfo(Response response);
}

und Ihrer Ansicht nach tut

<%= Model.Results[i] %>
<% foreach (var module in Model.ModuleSpecific) { %> 
<a href="<%=module.AdditionalLink%>">More</a> 
<% module.RenderAdditionalInfo(Response); %>
<% } %>

oder Modulansicht Modell Teilansicht Namen zur Verfügung stellen kann, usw. Beachten Sie, dass es die modules.GetModulesFor () und SearchViewModel, die die Arbeit machen - zum Beispiel, SearchViewModel kann IoC.GetInstanceByType tun ( „ModuleViewModel“ + passedModule.GetType (). Name.) - automatisch die spezifische Modulansicht Modellklasse Aufnehmen

Das ist die Idee. Es kann sein, dass ich Ihre Frage völlig falsch verstehen -. Sorry, wenn so

Ein Rat, ich persönlich fand, dass, wenn ich versuche zu allgemein zu sein, es unnötige Komplikationen zu dem Projekt hinzufügt (I sogar schrieb darüber). D. h ja Ihre Module sind unbekannt bei der Kompilierung, aber Sie haben etwas über sie wissen! Sie können Link hinzufügen Ergebnis suchen - hier ist der Erweiterungspunkt dafür. Man kann keine Bilder Erweiterungspunkte für „alles“, so zuerst musst du spezifische Fälle aufzulisten.

Andere Tipps

ich glaube, queen3 Antwort mehr auf Ihr spezifisches Problem geeignet ist, aber ich dachte, dass ich sowieso meine Ideen über die allgemeine Angelegenheit abgeben würde.

Ich betrachte tun etwas ähnliches mit den Techniken diskutiert in Matthew Abbott 's Blogpost . Mit MEF, können Sie einfach eine neue DLL in Ihr Portal fallen, ein Modul zu aktivieren.

mehrere Module auf einer einzigen Seite zu haben, ist ein bisschen tricker. RenderPartial funktionieren könnte, aber das ist in der Regel bedeutet für das Hinzufügen von Code, dass die Arbeiten aus dem gleichen Ansicht Modell. RenderAction auf der anderen Seite nutzt einen eigenen Controller und Modell. Ich würde bevorzugen im Allgemeinen nicht RenderAction in jedem anderen Szenario verwenden, weil es bricht oder zumindest faltet das MVC-Muster. In diesem Fall wäre es jedoch nur auf einer einzigen Seite verwendet werden, die zum Auslegen von mehreren Modulen verantwortlich ist. Alle Ihre Plugins könnten regelmäßige MVC Ansichten, Controller und Modelle sein.

Details auf RenderAction können hier zu finden .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top