2011-11-27 12 views
6

Tengo un motor de vista personalizado desarrollado internamente. En el mismo proyecto, me gustaría usar Razor para algunas páginas y mi motor personalizado para algunas páginas. ¿Cómo elige el framework MVC qué motor usar? Por cierto, mi motor personalizado no requiere ninguna plantilla, sino que genera páginas basadas en metadatos de la base de datos. Para mi motor personalizado no quiero configurar ningún archivo de plantilla. Lo que estoy esperando es que haya una manera de conducir el marco para usar cierto motor basado en el nombre del controlador y el nombre de la acción. ¿Existe esta flexibilidad en MVC3?¿Cómo elige MVC3 qué ViewEngine usar si tengo varios motores en la colección ViewEngines?

Respuesta

6

Su motor de vista debe implementar la interfaz IViewEngine. Después de que haya registrado su motor de visualización con el método ViewEngines.Engines.Add(), la estructura MVC llamará a FindView y FindPartialView cuando necesite un motor de vista para representar una vista.

Es absolutamente posible que los motores de vista múltiple operen uno al lado del otro. Si no desea que su motor de visualización se use en una situación específica, return new ViewEngineResult(new string[0]); de FindView o FindPartialView y MVC elegirá otro motor de visualización. Si desea que se use su motor de visualización, devuelve un ViewEngineResult válido que apunte a la clase de vista (que está implementando IView) que desea que Render el resultado.

Hay algunos detalles con el parámetro useCache. Si desea saber más, Louis DeJardin realizó una presentación excelente sobre la creación de su propio motor de visualización en TechEd 2011. Puede encontrar el video de Writing an ASP.NET MVC View Engine en Channel9.

+0

Gracias Marco. "Si no quiere que su motor de visualización se use en una situación específica, devuelve un nuevo ViewEngineResult (cadena nueva [0]); de FindView o FindPartialView y MVC elegirá otro motor de visualización". Esto de hecho funcionó bien. Pero es un viaje innecesario a mi motor personalizado cuando sé exactamente qué motor usar también en algunos casos. Probablemente los diseñadores de MVC no pensaron en esta situación. ¡Gracias de nuevo! – Charasala

0

Creo que la manera más fácil sería implementar un IViewPageActivator, http://bradwilson.typepad.com/blog/2010/10/service-location-pt11-view-page-activator.html y http://msdn.microsoft.com/en-us/library/system.web.mvc.iviewpageactivator(v=vs.98).aspx.

Creo que devolver nulo desde el método Create lo hará más tarde predeterminado al predeterminado IViewPageActivator. Lo inyecta en el DependencyResolver, http://bradwilson.typepad.com/blog/2010/10/service-location-pt5-idependencyresolver.html.

Puede ser más fácil de usar si está utilizando un marco de inyección de dependencia como NInject o Unity.

+0

Sí. Estoy usando inyección de dependencia con Unity. ¿Puede explicar cómo se puede resolver implementando IViewPageActivator? Si agrego alguna implementación personalizada a IViewPageActivator, nuevamente el mismo problema que publiqué también existe aquí. ¿Puedo tener más de un IViewPageActivator? ¿Cómo configurar uno o el otro? – Charasala

+0

No sé si puede tener más de un IViewPageActivator, pero no debería ser difícil implementar uno personalizado que resuelva eso. Además, creo que si devuelves el valor nulo, se activará el predeterminado. –

Cuestiones relacionadas