2013-07-30 4 views
72

Desidero poter richiedere i file statici .html che si trovano nella cartella ~/Views. Secondo la documentazione, il sistema di routing controlla se un URL corrisponde a un file su disco prima di valutare i percorsi dell'applicazione.Come si richiedono i file .html statici nella cartella ~/Views in ASP.NET MVC?

Ma quando richiedo il file si verifica un errore 404.

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

Cosa mi sono perso?

risposta

85

Desidero poter richiedere file .html statici che si trovano nella cartella '~/Views'.

Non è possibile. 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 collocati nella cartella Views che ha un significato speciale in ASP.NET MVC.

Si potrebbe avere una cartella ~/Static in cui è possibile inserire i file HTML. E poi accedervi così:

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

Oppure, anziché denominare la cartella "statica", è possibile simulare la struttura del nome del controller che si trova all'interno della cartella Visualizzazioni .. quindi l'URL ha lo stesso "aspetto". Per esempio. dato che non puoi inserire 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) dove puoi registra il provider statico per i file html, ma anche instrada il normale modo MVC. Ho avuto solo un gioco veloce con questo, ma è quello che ho fatto con un progetto di test. Esecuzione di Kestrel su Linux ... ma IIS dovrebbe essere lo stesso, suppongo. – ppumkin

+1

@bkwdesign Sono sicuro che la sua configurazione controllata mimando la struttura delle cartelle ha incasinato il gestore predefinito dei miei controller e l'ha reso inaccessibile. Quindi prova questa situazione. –

29

Voglio essere in grado di richiedere i file .html statici che si trovano nella cartella ~ l'/ Vista.

Beh, è ​​possibile. La risposta contrassegnata non è del tutto corretta, sebbene fornisca una soluzione.

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

Quindi, ecco un semplice tweak che è possibile eseguire nel file web.config trovato nella cartella Views, senza compromettere la sicurezza delle viste del mvc asp.net. Questo garantirà i file .cshtml come al solito, ma lasciare i vostri file .html alone.a

Modificare questa

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

--to--

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

Questo potrebbe essere ancora pericoloso con altri file come .aspx o .ascx o quelli di motori di visualizzazione di terze parti. Molto meglio per la lista bianca come da risposta di cs3x. – pwdst

+1

@pwdst: se utilizzi una combinazione di viste laterali del server, allora è possibile che i singoli tipi di whitelist siano migliori. Vogliamo solo proteggere i file .cshtml, quindi abbiamo usato questo perché è un po 'meno prolisso. – Vikas

59

Per consentire file come js e html nella cartella Visualizzazioni modificare il web.config in vista-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> 

+7

+ punti brownie per Kermit –

+0

Ho dovuto rimuovere la riga "routes.RouteExistingFiles = true;" in RouteConfig.RegisterRoutes per fare in modo che questo funzioni –

+0

Mentre la risposta contrassegnata contiene informazioni utili, questa è la risposta migliore. Testato e funzionante nel mio attuale progetto. –

9

Un'altra opzione alternativa è quella di inserire un metodo d'azione in qualche controllo desiderato per servire il file html

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

Accedere alla html http://yoursite/controller/MyHtml.È possibile estendere questo metodo di azione per accettare il nome del file html come parametro metodo/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; 
}