Come si richiedono file .html statici nella cartella ~ / Views in ASP.NET MVC?


92

Voglio essere in grado di richiedere .htmlfile statici che si trovano nella ~/Viewscartella. Secondo la documentazione, il sistema di routing controlla se un URL corrisponde a un file su disco prima di valutare i percorsi dell'applicazione.

Ma quando richiedo il file si verifica un 404errore.

Il mio file si trova nella cartella ~ / Views. L'URL è:http://[localhost]/Views/HtmlPage1.html

Cosa mi sono perso?

Risposte:


111

Voglio essere in grado di richiedere file .html statici che si trovano nella cartella "~ / Views".

Non puoi. C'è un file web.config in questa cartella che proibisce esplicitamente l'accesso a qualsiasi file da esso. Se si desidera poter accedere ai file dal client, questi file non devono essere inseriti nella Viewscartella che ha un significato speciale in ASP.NET MVC.

Potresti avere una ~/Staticcartella in cui inserire i tuoi file HTML. E poi accedilo in questo modo:

http://example.com/yourapplicationname/static/foo.html

4
Oppure, invece di chiamare la cartella "statica", potresti imitare la struttura del nome del controller che si trova all'interno della cartella Views .. in modo che l'URL abbia lo stesso "aspetto". Ad esempio, poiché non puoi inserire il tuo plainjane Edit.html in Views / Order / Edit.html - lo metti in ~ / Order / Edit.html
bkwdesign

2
Questo è ora cambiato con l'ultimo ASP.NET (vNext) in cui è possibile registrare il provider statico per i file html ma anche instradare il normale modo MVC. Ci ho giocato solo velocemente, ma è quello che ho fatto con un progetto di prova. Funzionando attraverso il gheppio su Linux ... ma suppongo che IIS dovrebbe essere lo stesso.
Piotr Kula

1
@bkwdesign Sono sicuro che la sua configurazione controllata imitando la struttura delle cartelle ha incasinato il gestore predefinito del mio controller e lo ha reso inaccessibile. Quindi prova questa situazione.
Hunter-Orionnoir

78

Per consentire file come js e html nella cartella Views, modificare web.config in views-Folder:

<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>


1
Ho dovuto rimuovere la riga "routes.RouteExistingFiles = true;" in RouteConfig.RegisterRoutes affinché funzioni
Sam Sippe,

Sebbene la risposta contrassegnata contenga informazioni utili, questa è la risposta migliore. Testato e funzionante nel mio progetto attuale.
A. Murray

1
E i file CSS?
Leandro

La risposta di @Darin Dimitrov fornisce una soluzione alternativa, ma dovrebbe essere contrassegnata come risposta
Kunal

31

Voglio essere in grado di richiedere file .html statici che si trovano nella cartella ~ / Views.

Beh puoi. La risposta contrassegnata non è del tutto corretta, sebbene dia una soluzione.

Il ragionamento nella risposta contrassegnata è corretto, è web.config (l'impostazione BlockViewHandler deve essere specifica) nella cartella Views che impedisce l'accesso diretto ai file. È lì per proteggere le visualizzazioni in Asp.Net MVC. Ma se hai posto una domanda su come servire questi file direttamente, probabilmente hai un motivo valido per farlo, come usare le viste parziali di AngularJS (come nel nostro caso) in cui non vogliamo duplicare la cartella delle viste con nomi strani.

Quindi ecco un tweak molto semplice che puoi fare nel file web.config che si trova nella cartella Views, senza compromettere la sicurezza delle tue viste mvc asp.net. Questo proteggerà i file .cshtml come al solito ma lascerà soli i file .html

Cambia questo

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

--per--

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

3
Questo potrebbe ancora essere pericoloso con altri file come file .aspx o .ascx o quelli di motori di visualizzazione di terze parti. Molto meglio da inserire nella whitelist secondo la risposta di cs3x.
pwdst

1
@pwdst: se stai utilizzando una combinazione di visualizzazioni lato server, sì, l'inserimento nella whitelist di singoli tipi potrebbe essere migliore. Vogliamo solo proteggere i file .cshtml, quindi lo abbiamo usato perché è un po 'meno dettagliato.
Vikas

14

Un'altra opzione alternativa è inserire un metodo di azione in uno qualsiasi dei controller desiderati per servire il file html

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

Accedi all'html come http: // yoursite / controller / MyHtml . È possibile estendere questo metodo di azione per accettare il nome del file html come parametro method / querystrign e rendere il file in fase di esecuzione, ad esempio qualcosa di simile.

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

0

Se hai intenzione di utilizzare la cartella della vista interna, le risposte sopra dovrebbero essere le migliori, ma questa risposta può essere utile per gli utenti che stanno migrando a asp.net mvc core. Posizionare i file in wwwroot invece che nella cartella delle viste dovrebbe rendere le tue pagine html facilmente accessibili come localhost / myfile.html

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.