Domanda

Stavo guardando la presentazione di Scott Hanselman su ASP.NET MVC a San Francisco. Dopo averci pensato per un po ', ero perplesso su come approccio migliore costruzione di un sito ASP.NET MVC-based che ha una. Struttura di [portale | | modulare multi-vista] (ritirare la sua definizione preferita)

Per darvi un'idea di quello che sto cercando, la mia azienda costruisce un sacco di applicazioni portale in stile per i clienti fuori che incorporano un modulo di mappatura in grado di rispondere ad esso è di possedere stringhe di query e percorsi, modulo informazioni pacchi fiscale che simile ha il suo punto di vista (s), documento vista recupero che consente di visualizzare i documenti singoli e multipli ... si ottiene l'idea. La parte critica è che ogni modulo è veramente autonomo. Se un utente cerca un record d'imposta in base al nome che potrebbe vedere 10 risultati ( "John Doe" possiede alcune proprietà). Ogni risultato ha un link "Visualizza la mappa è" perché il framework per applicazioni web sa che c'è un modulo mappa disponibile. La "Map It" collegamento invia la richiesta di destra come http://myapp.com/taxparcel/map/123443 . Il controller mappa modulo risponde alla richiesta esterna con lo zoom alla mappa e mettendo in evidenza il pacco fiscale.

La chiave di tutto questo flusso è che sia i moduli fiscali e la mappatura sono sulla stessa pagina web.

Così come fa che si adattano nella casella di ASP.NET MVC? Partial? viste Sub? viste multiple per un singolo controller? Se sto manca solo la parte evidente della documentazione quindi sentitevi liberi di lambast me pubblicamente e includere il link. In caso contrario, sono aperti ai suggerimenti.

È stato utile?

Soluzione

Bene, il vostro modello di vista la necessità di fornire punti di estensione. Si considera che i dati per la visualizzazione contiene quelle parti del modulo, e viene raccolto dal controllore qualche modo:

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);
}

Ora, i dati specifici moduli è convertito dal SearchViewModel in qualcosa che View può utilizzare:

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

e la visualizzazione fa

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

o del modulo vista del modello in grado di fornire nome vista parziale, ecc Si noti che si tratta di modules.GetModulesFor () e SearchViewModel che fare il lavoro - per esempio, SearchViewModel può fare IoC.GetInstanceByType ( "ModuleViewModel" + passedModule.GetType (). nome) -. il prelievo automatico di specifico modulo di classe vista del modello

Questa è l'idea. Può essere che ho capito la tua domanda completamente sbagliato -. Scusa se così

Un consiglio, personalmente ho trovato che se cerco di essere troppo generico, aggiunge complicazioni non necessari al progetto (ho anche ha scritto su di esso). Cioè sì i moduli non sono noti al momento della compilazione, ma si deve sapere qualcosa su di loro! Essi possono aggiungere link al risultato della ricerca - ecco il punto di estensione per questo. Non si può immagini punti di estensione per "nulla", quindi prima è necessario elencare i casi specifici.

Altri suggerimenti

Credo che la risposta di queen3 è più adatto al vostro problema specifico, ma ho pensato di pubblicare le mie idee sulla questione generale in ogni modo.

Sto pensando di fare qualcosa di simile utilizzando le tecniche discusse in s 'Matthew Abbott blogpost . Utilizzando MEF, si può solo cadere una nuova DLL nel portale per attivare un modulo.

Avere più moduli in una singola pagina è un po 'Tricker. RenderPartial potrebbe funzionare, ma che è generalmente inteso per l'aggiunta di codice che funziona fuori lo stesso modello di vista. RenderAction d'altra parte utilizza il proprio controllore e il modello. Io in genere non favorirebbe utilizzando RenderAction in qualsiasi altro scenario perché si rompe o almeno convolves il pattern MVC. In questo caso tuttavia, sarebbe utilizzato solo su una singola pagina che è responsabile per la disposizione più moduli. Tutti i plugin potrebbe essere regolari MVC viste, controller e modelli.

I dettagli relativi RenderAction possono essere trovati qui .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top