2011-11-27 8 views
6

Ho un motore di visualizzazione personalizzato sviluppato internamente. Nello stesso progetto, vorrei usare Razor per alcune pagine e il mio motore personalizzato per alcune pagine. In che modo il framework MVC sceglie quale motore utilizzare? A proposito, il mio motore personalizzato non richiede alcun modello, rende pagine basate su meta-dati dal database. Per il mio motore personalizzato non voglio impostare alcun file modello. Quello che mi aspetto è che ci dovrebbe essere un modo per guidare il framework per usare determinati motori in base al nome del controller e al nome dell'azione. Esiste questa flessibilità in MVC3?In che modo MVC3 sceglie quale ViewEngine utilizzare se ho più motori nella raccolta ViewEngines?

risposta

6

Il motore di visualizzazione deve implementare l'interfaccia IViewEngine. Dopo aver registrato il motore di visualizzazione con il metodo ViewEngines.Engines.Add(), il framework MVC chiamerà FindView e FindPartialView ogni volta che è necessario un motore di visualizzazione per eseguire il rendering di una vista.

E 'assolutamente possibile per i motori di visione multipla operare fianco a fianco. Se non si desidera utilizzare il motore di visualizzazione in una situazione specifica, è possibile effettuare il return new ViewEngineResult(new string[0]); da FindView o FindPartialView e MVC sceglierà un altro motore di visualizzazione. Se si desidera utilizzare il motore di visualizzazione, è necessario restituire un valore valido ViewEngineResult indicando la classe di visualizzazione (che sta implementando IView) a cui si desidera il risultato: Render.

Ci sono alcune specifiche con il parametro useCache. Se vuoi saperne di più, c'è stata un'ottima presentazione sulla costruzione del tuo motore di visualizzazione al TechEd 2011 di Louis DeJardin. Puoi trovare il video di Writing an ASP.NET MVC View Engine su Channel9.

+0

Grazie Marco. "Se non si desidera utilizzare il motore di visualizzazione in una situazione specifica, si restituisce nuovo ViewEngineResult (nuova stringa [0]), da FindView o FindPartialView e MVC sceglierà un altro motore di visualizzazione.". Questo ha davvero funzionato bene. Ma il suo viaggio non necessario al mio motore personalizzato quando conosco esattamente quale motore usa in alcuni casi. Probabilmente i progettisti di MVC non hanno pensato a questa situazione. Grazie ancora! – Charasala

0

Penso che il modo più semplice sarebbe implementare uno IViewPageActivator, http://bradwilson.typepad.com/blog/2010/10/service-location-pt11-view-page-activator.html e http://msdn.microsoft.com/en-us/library/system.web.mvc.iviewpageactivator(v=vs.98).aspx.

Penso che restituire null dal metodo Create lo renderà in seguito predefinito al valore predefinito IViewPageActivator. L'hai iniettato nel DependencyResolver, http://bradwilson.typepad.com/blog/2010/10/service-location-pt5-idependencyresolver.html.

Potrebbe essere più semplice da utilizzare se si utilizza un framework di distribuzione delle dipendenze come NInject o Unity.

+0

Sì. Sto usando un'iniezione di dipendenza con Unity. Puoi spiegare come può essere risolto implementando IViewPageActivator. Se aggiungi qualsiasi implementazione personalizzata a IViewPageActivator, anche in questo caso lo stesso problema che ho postato esiste anche qui. Posso avere più di un IViewPageActivator? Come configurare l'uno o l'altro? – Charasala

+0

Non so se è possibile avere più di un IViewPageActivator, ma non dovrebbe essere difficile implementare quello personalizzato che lo risolva. Inoltre, penso che la restituzione di null causerà l'impostazione predefinita per dare il via. –

Problemi correlati