2011-02-24 630 views
10

Administro un sitio asp.net grande que se ha convertido previamente del sitio html estático a asp.net.¿Puedo servir archivos .html usando Razor como si fueran archivos .cshtml sin cambiar la extensión de todas mis páginas?

Por varias razones (principalmente SEO) decidimos no cambiar el nombre de todos los archivos a .aspx cuando originalmente convertimos el sitio. Esto fue muy fácil de hacer con solo agregar buildProvider y httpHandler a web.config.

<buildProviders> 
    <add extension=".html" type="System.Web.Compilation.PageBuildProvider"/> 
</buildProviders> 

<httpHandlers> 
    <add path="*.html" verb="*" type="System.Web.UI.PageHandlerFactory"/> 
</httpHandlers> 

Ahora Estoy actualizando el sitio para utilizar páginas web ASP.NET con archivos de afeitar cshtml. Puedo cambiar el nombre de todos los archivos si es necesario y usar la reescritura de url para que las URL permanezcan iguales, sin embargo, sería mucho más fácil si pudiera configurar el archivo web.config para que analice los archivos .html como si fueran .cshtml .

He buscado bastante y no he encontrado nada equivalente a PageHandlerFactory para las páginas de afeitar. Parece como si fuera solo un mecanismo interno en el controlador .NET 4.0 ISAPI.

El sitio se está ejecutando actualmente en el servidor Windows 2003 e IIS 6. Actualizaremos a 2008/IIS 7.5 en un futuro próximo, pero preferiría no esperar por eso.

¿Hay alguna forma de obtener los archivos .html analizados por la máquina de afeitar como si fueran archivos .cshtml?

Respuesta

16

Gracias a SLaks por orientarme en la dirección correcta, pero aun así me tomó unas horas de excavación en la fuente MVC para encontrar la solución.

1 - Necesidad de poner RazorBuildProvider en web.config

<buildProviders> 
    <add extension=".html" type="System.Web.WebPages.Razor.RazorBuildProvider"/> 
</buildProviders> 

Y añadir System.Web.WebPages.Razor a las asambleas si no está ya allí.

<assemblies> 
    [...] 
    <add assembly="System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> 
</assemblies> 

2 - Añadir 2 líneas en global.asaxApplication_Start() método

// Requires reference to System.Web.WebPages.Razor 
System.Web.Razor.RazorCodeLanguage.Languages.Add(
    "html", new CSharpRazorCodeLanguage()); 

WebPageHttpHandler.RegisterExtension("html"); 
+0

Estoy devolviendo un archivo css en lugar de un archivo cshtml. ¿Es válido este método para MVC3? En caso afirmativo, ¿cuál web.config? la carpeta raíz o en la carpeta Vistas? Y dónde exactamente en el web.config. Intenté hacer esto pero no agregó la extensión a la lista de idiomas. ¿Alguna idea? – Idrees

+0

@Idiomas: Sí. La raíz Web.config. lista de idiomas? – SLaks

+0

@SLaks el líder del equipo dejó caer la idea. Así que COOL: D – Idrees

0

Como esta realidad ha resuelto para su uso con VS2012/.NET 4.5. Al usar los ejemplos de arriba en un proyecto de C# 5, no tengo suerte :(

Cuestiones relacionadas