2010-10-31 15 views
9

Estoy construyendo una aplicación ASP.Net MVC 2 para un cliente y requiere la capacidad del usuario para definir vistas. En este sitio web se muestra cómo hacerlo - http://www.umbraworks.net/bl0g/rebuildall/2009/11/17/ASP_NET_MVC_and_virtual_views, pero me encontré con algunos comentarios allí y en otros lugares que esta era una mala idea. ¿Cuál sería la mejor manera de lograr que los usuarios puedan definir toda la página? Además, ¿por qué la base de datos es una mala idea? Gracias.MVC Views from Database

Wade

+0

No estoy seguro de por qué alguien votaría por el cierre, pero ¿podría agregar un comentario para explicar dónde estoy fuera de línea? – Wade73

+2

Esto suena como el tipo de cosas para las cuales es posible que desee considerar un Sistema de gestión de contenido. – Andy

+1

Sorprendentemente eso es lo que estoy haciendo. – Wade73

Respuesta

6

bien si se puede escribir la aplicación utilizando MVC 3 Beta en lugar de MVC 2 puede utilizar esta técnica:

http://buildstarted.com/2010/11/02/razor-without-mvc-part-ii/

Puede almacenar su "vista" como cadena en la base de datos a continuación, sólo tire de ella y pasarlo al motor de análisis y todo está listo.

Funciona muy bien.

+0

+1 y recompensa por la respuesta Gracias. – Wade73

+1

Ben y Matt lo hicieron de nuevo. Han actualizado este proyecto y lo han puesto en codeplex. http://razorengine.codeplex.com/ – Jim

1

OK, no soy una gran autoridad en esto, pero ...

supongo que la razón por la que podría ser una mala idea se le está dando el acceso de root usuario de la aplicación, después de todo código arbitrario se puede ejecutar desde una vista. Además, el programador no verificará ni probará las vistas, es posible que no compilen o que tengan otros problemas.

Puede analizar el texto proporcionado por el usuario que forma la vista y tratar de desinfectarlo, pero esto va a ser difícil. Aunque tener el motor de vista MVC como su CMS parece que está obteniendo el marco para hacer el trabajo pesado para usted, es demasiado poderoso; expresar en código lo que el usuario no puede hacer es más difícil que expresar en código lo que puede hacer. Es por eso que (tal vez) este sitio utiliza el descuento en lugar de HTML para el marcado en las preguntas y respuestas.

En cuanto a la base de datos que es una mala idea, creo que las personas pueden estar en contra de esto debido a un problema percibido al golpear el disco duro. Sin embargo, no estoy seguro de que este sea un problema insuperable; la vista probablemente se almacenará en la memoria caché después de que se haya hecho jit, aunque no estoy seguro, tendrás que probar esto. Si es así, deberá encontrar una forma de hacer que el jit se ejecute nuevamente cuando se edite una vista, o tendrá que reciclar el sitio. Supongo que es necesario forzar el reinicio porque cuando se cambia un archivo aspx en un sitio no precompilado, el marco recibe una notificación de cambio de archivo del SO y la vista actualizada se vuelve a activar la próxima vez que se acceda. Incluso si me equivoco y la vista se saca del DB y se activa cada vez que se usa, debería poder usar el almacenamiento en caché para evitar que esto ocurra demasiado.

En algunas situaciones, las vistas en una base de datos pueden ser el mejor enfoque, por ejemplo, si los usuarios que crean las vistas son programadores. Lo consideraría con mucho cuidado.

En cuanto a la alternativa, un conjunto de herramientas de CMS (N2, Orchard etc.) podría ser una buena idea.

+0

En realidad, almacena en caché la vista que causa problemas cuando se realiza una edición, pero he encontrado una forma de evitarlo. Lo que espero encontrar es una mejor manera. – Wade73

+0

Bueno, la forma obvia de hacerlo es modificar uno de los sitios de archivos supervisados. Lea web.config e incremente un contador de "reciclaje" en él, o cambie un archivo aspx. Entonces el appdomain será reciclado. Esto será bastante caro. –