2012-09-12 8 views
10

Aquí está el escenario. He extendido MvcWebRazorHostFactory para que pueda hacer un poco de magia de vista adicional en el momento de la compilación. La magia exacta no importa.Obtenga Visual Studio para resaltar la sintaxis de Razor con un host personalizado. FactoryType

La inscripción en mis ~ \ views \ Web.config se ve así:

<host factoryType="StackExchange.MyNamespace.MyFactory, StackExchange.MyNamespace" /> 

Hay al montaje apropiado en el proyecto, una copia de la asamblea en una carpeta \ lib, y he confirmó que se copió en \ bin como se esperaba. Además, la magia de vista real sucede cuando se construyen vistas, por lo que ASP.NET sí mismo está encontrando todo.

Lo que no funciona en Visual Studio (2012) 's Razor Resaltado de sintaxis.

enter image description here

arriba es una instantánea de cómo falla el resaltado de sintaxis. Como regla, no se puede encontrar nada que no se encuentre en un espacio de nombre directamente @using 'd (y, por lo tanto, obtiene el subrayado rojo ondulado) y la directiva @model no funciona. Esto apunta a algunos problemas para obtener nuestro automatically included namespaces en el Web.config.

La información sobre herramientas para el error en @model es "El nombre 'modelo' no existe en el contexto actual".

A través de la prueba y error He reducido la causa raíz a la sección de configuración de host anterior, aunque tenemos algunos otros ajustes alrededor de Razor (un pageBaseType personalizado por ejemplo) es esa línea que rompe todo.

cosas que he intentado hasta ahora:

  • fuerte nombrar el conjunto
  • Instalación del conjunto de los GAC
    • This page consejos en este siendo necesario.

Cuando nombrado fuertemente mis ~ \ views \ Web.config terminó pareciéndose así:

<host factoryType="StackExchange.MyNamespace.MyFactory, StackExchange.MyNamespace, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b61d663b67b05bd2" /> 

I comprobado la versión, Cultura y PublicKeyToken contra el GAC utilizando "gacutil -l ".

Supongo que otro posible punto de falla es el propio GAC, ya que hay toneladas de versiones .NET en mi caja. Tanto el ensamblado como el sitio web están diseñados con .NET 4.5 (ambos hacen referencia a MVC 4, Razor 2, etc.). La ruta al gacutil que he estado usando durante la depuración es Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\gacutil.exe.

De vez en cuando, durante el proceso de aventar una causa raíz, recibía un mensaje de error con el siguiente mensaje: "StackExchange.MyNamespace.MyFactory no se pudo encontrar" en la primera línea de una vista. El subrayado estaría en el color "Otro error" (Púrpura en el Tema Oscuro VS2012). No pude reproducir eso de manera confiable, así que no puedo obtener una captura de pantalla.


Así que mi pregunta es, ¿alguien sabe cómo obtener Visual Studio (2012 nuevo) para manejar adecuadamente la maquinilla de afeitar de vistas con una fábrica de host personalizado?

Mi mejor conjetura actual es hacer reemplazos Web.config realmente hacky, así que tengo una configuración mientras edito y otra mientras se depura. Aunque no soy fanático de esa idea.

Parece que esto debería funcionar, y que Visual Studio simplemente está teniendo problemas para encontrar algo que necesita. Simplemente no sé lo que es eso.


Actualización después de un poco más de experimentación.

Tengo más desarrolladores para reproducir que es el <host pageFactoryType="...">, incluso en una aplicación vanilla MVC4 (los ejemplos anteriores son, algo obvio, de la solución StackOverflow, que podría haber tenido algún cruft).

Hemos encontrado un trabajo, sin embargo, es comprar una licencia ReSharper. No es un gran (o barato) trabajo, pero un trabajo de todos modos.

Con ReSharper instalado todo funciona con una advertencia. Si tiene un registro personalizado <pages pageBaseType="...">, el tipo debe estar en el mismo proyecto, o si no obtiene intellisense para la referencia @this.Model (sin embargo, la directiva @model funciona).


Más actualizaciones.

Parece que un no-op HostFactory (uno que se extiende MvcRazorHostFactory pero no define ningún método o contener cualquier otro código) funciona bien si que nombre seguro e instalarlo en la GAC. Creo que estaba usando el GAC incorrecto al probarlo antes, pero (con algunos estímulos externos) pude hacerlo funcionar usando el gacutil explícitamente x64.

Ahora el problema es averiguar qué pasa con mi fábrica de host en particular; más detalles llegando a medida que son descubiertos.

Respuesta

6

Después de una discusión con Microsoft, encontramos la causa raíz de este problema.

As usual, it was my code.

El error de raíz era una referencia MVC3 en el tipo de fábrica personalizado, a pesar de que el proyecto (y todo lo que lo rodea) era MVC4.

Para resumir todo, para que Visual Studio IntelliSense funcione.archivos cshtml con una costumbre <host factoryType>:

  • Debe asignar un nombre fuerte es su ensamblaje
  • Debe instalar el ensamblado en la GAC ​​
    • Todavía depurar y desplegar en contra de una copia local, pero VS se verá en el GAC
  • Es imprescindible tiene todas las referencias correctas *

Tenga en cuenta que tendrá que reiniciar Visual Studio después de instalarlo en el GAC, simplemente recargando la solución no es (normalmente) suficiente. También descubrimos que algunas (pero no todas) las instalaciones de ReSharper necesitarán que se borre su caché, para estar seguros borrará el caché.

Un pequeño error al agregar una referencia a un ensamblaje que reside en el GAC es que Visual Studio no lo copiará a su directorio de salida de manera predeterminada, esto puede funcionar para usted pero nos causó problemas. Puede cambiar esto en las propiedades de la referencia.

enter image description here

Además, Visual Studio se le dará un número de mensajes de error (el "Otro error" subrayado púrpura yo era incapaz de reproducir de forma fiable antes) si su fábrica de encargo lanza ninguna excepción; excepto tal vez en su constructor (que parecía un poco inconsistente).

Donde no recibe ayuda es el caso en el que estábamos, donde el tipo en sí tiene serios problemas. Fue solo una coincidencia que las cosas funcionaron en tiempo de ejecución (las interfaces con las que estamos jugando no cambiaron entre MVC3 y MVC4, y los nombres débiles hicieron el resto).

* Si es como nosotros y tiene instalados MVC beta 1 a 4, tenga en cuenta el PEBKAC en este paso.

Cuestiones relacionadas