¿Cómo se solicitan archivos .html estáticos en la carpeta ~ / Views en ASP.NET MVC?

92

Quiero poder solicitar .htmlarchivos estáticos que se encuentran en la ~/Viewscarpeta. Según la documentación, el sistema de enrutamiento verifica si una URL coincide con un archivo de disco antes de evaluar las rutas de la aplicación.

Pero cuando solicito el archivo 404surge un error.

Mi archivo se encuentra en la carpeta ~ / Views. La URL es:http://[localhost]/Views/HtmlPage1.html

¿Qué me he perdido?

alex.mironov
fuente

Respuestas:

111

Quiero poder solicitar archivos .html estáticos que se encuentran en la carpeta '~ / Views'.

No puedes. Hay un archivo web.config en esta carpeta que prohíbe explícitamente el acceso a cualquier archivo. Si desea poder acceder a los archivos desde el cliente, esos archivos no deben colocarse en la Viewscarpeta que tiene un significado especial en ASP.NET MVC.

Podría tener una ~/Staticcarpeta en la que colocar sus archivos HTML. Y luego acceda a él así:

http://example.com/yourapplicationname/static/foo.html
Darin Dimitrov
fuente
4
O, en lugar de nombrar su carpeta como 'estática', podría imitar la estructura del nombre del controlador que se encuentra dentro de la carpeta Vistas ... para que la URL tenga la misma 'apariencia'. Por ejemplo, dado que no puede poner su plainjane Edit.html en Views / Order / Edit.html, póngalo en ~ / Order / Edit.html
bkwdesign
2
Esto ahora ha cambiado con la última versión de ASP.NET (vNext), donde puede registrar un proveedor estático para archivos html pero también enrutar el modo MVC normal. Solo jugué rápido con él, pero eso es lo que hice con un proyecto de prueba. Ejecutando cernícalo en Linux ... pero IIS debería ser el mismo, supongo.
Piotr Kula
1
@bkwdesign Estoy seguro de que su configuración controlada imitando la estructura de carpetas arruinó el controlador predeterminado de mis controladores y lo hizo inaccesible. Así que prueba esta situación.
Hunter-Orionnoir
78

Para permitir archivos como js y html en la carpeta Vistas, edite web.config en vistas-Carpeta:

<system.webServer>
<handlers>
  <add name="JavaScriptHandler" path="*.js" verb="*"
     preCondition="integratedMode" type="System.Web.StaticFileHandler" />      
  <add name="HtmlScriptHandler" path="*.html" verb="*"
     preCondition="integratedMode" type="System.Web.StaticFileHandler" />
  <remove name="BlockViewHandler"/>
  <add name="BlockViewHandler" path="*" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler" />
</handlers>

cs3x
fuente
1
Tuve que eliminar la línea "route.RouteExistingFiles = true;" en RouteConfig.RegisterRoutes para que esto funcione
Sam Sippe
Si bien la respuesta marcada contiene información útil, esta es la mejor respuesta. Probado y trabajando en mi proyecto actual.
A. Murray
1
¿Qué pasa con los archivos CSS?
Leandro
La respuesta de @Darin Dimitrov ofrece una solución alternativa, pero esto debe marcarse como la respuesta
Kunal
31

Quiero poder solicitar archivos .html estáticos que se encuentran en la carpeta ~ / Views.

Bien tu puedes. La respuesta marcada no es del todo correcta, aunque da solución.

El razonamiento en la respuesta marcada es correcto, es web.config (la configuración de BlockViewHandler es específica) en la carpeta Vistas que evita que se acceda directamente a los archivos. Está ahí para asegurar las vistas en Asp.Net MVC. Pero si hizo una pregunta sobre cómo entregar estos archivos directamente, entonces probablemente tenga una razón válida para hacerlo, como usar vistas parciales de AngularJS (como en nuestro caso) donde no queremos duplicar la carpeta de vistas con nombres extraños.

Así que aquí hay un ajuste muy simple que puede hacer en el archivo web.config que se encuentra en la carpeta Vistas, sin comprometer la seguridad de sus vistas asp.net mvc. Esto protegerá los archivos .cshtml como de costumbre, pero deje sus archivos .html en paz.

Cambia esto

<add name="BlockViewHandler" path="*" verb="*" preCondition="integratedMode"    type="System.Web.HttpNotFoundHandler" />

--a--

<add name="BlockViewHandler" path="*.cshtml" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler" />
Vikas
fuente
3
Esto aún podría ser peligroso con otros archivos como archivos .aspx o .ascx o aquellos de motores de visualización de terceros. Es mucho mejor incluirlo en la lista blanca según la respuesta de cs3x.
pwdst
1
@pwdst: si está utilizando una combinación de vistas del lado del servidor, entonces sí, podría ser mejor incluir tipos individuales en la lista blanca. Solo queremos proteger los archivos .cshtml, por lo que usamos esto ya que es un poco menos detallado.
Vikas
14

Otra opción alternativa es insertar un método de acción en cualquiera de los controladores deseados para servir el archivo html

public ActionResult MyHtml()
{
    var result = new FilePathResult("~/Views/HtmlPage1.html", "text/html");
    return result;
}

Acceda al html como http: // yoursite / controller / MyHtml . Puede ampliar este método de acción para aceptar el nombre del archivo html como método / parámetro querystrign y representar el archivo en tiempo de ejecución, por ejemplo, algo como esto.

 public ActionResult MyHtml(string htmlPageName)
 {
      var result = new FilePathResult($"~/Views/{htmlPageName}.html", "text/html");
      return result;
 }
Venkatesh Muniyandi
fuente
0

Si planea usar la carpeta de vista interior, las respuestas anteriores deberían ser las mejores, pero esta respuesta puede ser útil para los usuarios que están migrando al núcleo asp.net mvc. Colocar archivos en wwwroot en lugar de la carpeta de vistas debería hacer que sus páginas html accedan fácilmente como localhost / myfile.html

Kurkula
fuente