El orden en que registra los motores de visualización no importa (mucho). Por el contrario, los motores de vista toman un conjunto de ViewLocationFormats
, y si una ruta de vista particular se ajusta al nombre formateado, ese motor se utilizará. Solo si tiene formatos conflictivos, la orden de registro es importante.
En el caso de chispa, las vistas deben tener la extensión .spark
. WebFormViewEngine
responderá a cualquiera con extensiones .aspx
o .ascx
. Y, por supuesto, como se mencionó anteriormente, puede anular todo esto cambiando el ViewLocationFormats
suministrado a los motores de vista individual.
Actualizado:
Me echó un vistazo a través de la fuente tanto de SparkViewFactory
y WebFormViewEngine
(o más específicamente, VirtualPathProviderViewEngine
, que este último se deriva de), y puedo decir por qué estás viendo este extraño comportamiento.
En primer lugar, el método Find
en la clase ViewEngineCollection
funciona así (simplificado):
foreach (IViewEngine engine in Items) {
// Query engine for cached view
}
foreach (IViewEngine engine in Items) {
// Query engine for uncached view
}
En otras palabras, siempre va a tratar de encontrar una vista en caché, en cualquier motor, antes recurriendo al modo no en caché
La forma en que los motores de vista individuales implementan esto es la segunda sobrecarga del método FindView
, que toma un argumento bool
llamado useCache
.
Sin embargo, y aquí es donde la cosa se pone raro - el VirtualPathProviderViewEngine
y SparkViewEngine
tienen ideas muy diferentes de lo que significa el argumento useCache
.Hay demasiado código para volver a publicar aquí, pero la idea básica es:
El SparkViewFactory
buscará única en la caché si es useCache
true
. Si no encuentra nada, automáticamente devuelve un "resultado de falta de caché", es decir, nada. Por otro lado, si useCache
es false
, no se verá en la memoria caché, omitirá el paso de comprobación de caché y realizará los movimientos normales para resolver y crear una vista real.
El VirtualPathProviderViewEngine
, por el contrario, busca en la caché si es useCache
true
, y si no encuentra la vista en la memoria caché, sale y crea uno nuevo y añade que a la caché .
Ambos enfoques de trabajo con respecto a la forma en ViewEngineCollection
lleva a cabo su búsqueda.
En el caso de la chispa, se "pierde" en la primera iteración de motores de vista, pero "éxitos" en la segunda, y después de que la vista se agrega a la caché. No hay problema.
En el caso de VirtualPathProviderViewEngine
, "falla" internamente pero devuelve un "golpe" de todos modos en la primera iteración, momento en el que la vista se almacena en caché.
Así que debería poder ver dónde está el problema aquí. La única VirtualPathProviderViewEngine
parece estar tomando precedencia sobre el SparkViewEngine
porque el primero siempre tiene éxito en la primera iteración (caché), pero Spark tiene éxito solamente en la segunda iteración (sin caché).
En la llanura Inglés, Spark realmente pone preguntado primero, pero responde: "No, no tengo ese punto de vista todavía Pruébalo sin la memoria caché en su lugar.". WebForms se pregunta en segundo lugar, pero dice automáticamente "I no tengo esa vista, pero hice una para usted de todos modos, aquí está".. Y desde ese momento, el WebFormViewEngine
siempre tiene prioridad porque tiene la vista almacenada en caché y Spark no.
Resumen: Spark es conseguir prioridad, pero debido a una peculiaridad en la forma de chispa trata el argumento useCache
, se está haciendo dejó en el polvo cuando el motor de formularios Web está activo al mismo tiempo. O bien WebForm está demasiado ansioso o Spark es flojo, dependiendo de su perspectiva.
En pocas palabras, la solución es para no tener puntos de vista contradictorios. Si ha registrado varios motores de vistas, entonces debe tratar cualquier nombre de vista que pueda ser manejado por cualquiera de ellos/ambos como comportamiento indefinido.
Resumiendo: Al eliminar el archivo Index.aspx se utilizará Index.spark. – LukLed
Todavía no entiendo del todo. Los ViewLocationFormats se definen en VirtualPathProviderViewEngine, es una implementación interna específica para un motor de visualización. Si ASP.NET MVC tiene múltiples motores de vista registrados, consultará uno por uno para ver si un motor de vista puede manejar la solicitud. El primer motor de vista responde sí procesa la solicitud. En mi caso, tanto Spark como WebFormViewEngine pueden manejar la solicitud ya que Index.aspx e Index.spark están ahí. Entonces, ¿por qué WebForViewEngine siempre tiene prioridad? – intangible02
@ intangible02: Probado y verificado, busqué en la fuente y ahora tengo una explicación para eso, eche un vistazo. – Aaronaught