2013-07-30 5 views
72

Ich möchte statische .html Dateien, die in der ~/Views Ordner befinden können anfordern. Gemäß der Dokumentation überprüft das Routing-System, ob eine URL mit einer Datenträgerdatei übereinstimmt, bevor die Routen der Anwendung ausgewertet werden.Wie fordern Sie statische .html-Dateien im Ordner ~/Views in ASP.NET MVC an?

Aber wenn ich die Datei anfordern, tritt ein 404 Fehler auf.

Meine Datei befindet sich im Ordner ~/Views. Die URL lautet: http://[localhost]/Views/HtmlPage1.html

Was habe ich verpasst?

Antwort

85

Ich möchte statische .html-Dateien anfordern können, die im Ordner "~/Views" befinden.

Sie können nicht. In diesem Ordner befindet sich eine Datei web.config, die den Zugriff auf eine Datei ausdrücklich verbietet. Wenn Sie auf Dateien vom Client zugreifen möchten, sollten diese Dateien nicht in den Ordner Views gestellt werden, der eine besondere Bedeutung in ASP.NET MVC hat.

Sie könnten einen Ordner ~/Static haben, wo Sie Ihre HTML-Dateien platzieren könnten. Und dann greifen sie wie folgt aus:

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

Oder, anstatt Ihren Ordner 'statisch' zu benennen, könnten Sie die Controller-Namenstruktur nachahmen, die sich im Views-Ordner befindet. Die URL hat also das gleiche 'Aussehen'. Z.B. da du deine plainjane * Edit.html * in Views/Order/Edit.html nicht einfügen kannst - du legst sie in ~/Order/Edit.html – bkwdesign

+2

Das hat sich jetzt mit dem neuesten ASP.NET (vNext) geändert, wo du kannst statischen Provider für HTML-Dateien registrieren, aber auch den normalen MVC-Weg weiterleiten. Ich hatte nur ein schnelles Spiel, aber das habe ich mit einem Testprojekt gemacht. Durch Turmfalke unter Linux laufen .. aber IIS sollte das gleiche sein, nehme ich an. – ppumkin

+1

@bkwdesign Ich bin sicher, dass seine Konfiguration durch Nachahmung der Ordnerstruktur mein Controller-Standard-Handler durcheinander gebracht und unerreichbar gemacht hat. Testen Sie diese Situation also. –

29

Ich möchte statische HTML-Dateien anfordern können, die in die ~/Ansichten Ordner befinden.

Nun, Sie können. Die markierte Antwort ist nicht ganz korrekt, obwohl sie eine Lösung bietet.

Die Argumentation in der markierten Antwort ist korrekt, es ist web.config (BlockViewHandler-Einstellung, um spezifisch zu sein) im Views-Ordner, die den direkten Zugriff auf die Dateien verhindert. Es dient zur Sicherung der Ansichten in Asp.Net MVC. Wenn Sie jedoch eine Frage stellen, ob Sie diese Dateien direkt bereitstellen möchten, haben Sie wahrscheinlich einen guten Grund dafür, z. B. AngularJS-Teilansichten (wie in unserem Fall) zu verwenden, in denen wir den Ansichtsordner nicht mit seltsamen Namen duplizieren sollen.

Also hier ist eine sehr einfache Optimierung, die Sie in der Datei web.config im Ordner Ansichten finden können, ohne die Sicherheit Ihrer asp.net mvc Ansichten zu gefährden. Dadurch werden die .cshtml Dateien wie gewohnt sichern, aber Ihre .html-Dateien alone.A

Ändern Sie diese

<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

Dies könnte immer noch gefährlich sein mit anderen Dateien wie .aspx oder .ascx-Dateien oder solche von Drittanbietern View Engines. Viel besser, um Whitelist nach cs3x Antwort zu whitelist. – pwdst

+1

@pwdst: Wenn Sie eine Mischung aus Server-Seitenansichten verwenden, dann ist es vielleicht besser, einzelne Typen zu whitelisting. Wir wollen nur die .cshtml-Dateien schützen, also haben wir das verwendet, da es etwas weniger ausführlich ist. – Vikas

59

Damit Dateien wie js und html verlassen in Ordner Sichten der web.config in Ansichten-Ordner bearbeiten:

<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

+ Pluspunkte für Kermit –

+0

Ich musste die Zeile "routes.RouteExistingFiles = true;" in RouteConfig.RegisterRoutes, damit dies funktioniert –

+0

Während die markierte Antwort nützliche Informationen enthält, ist dies die bessere Antwort. Getestet und arbeite in meinem aktuellen Projekt. –

9

Eine weitere alternative Möglichkeit ist, eine Aktionsmethode in einem der gewünschten Steuereinheit einzufügen, um die HTML-Datei

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

Zugriff auf die HTML als http://yoursite/controller/MyHtml zu dienen.Sie können diese Aktionsmethode erweitern, um den HTML-Dateinamen als Methode/querystrign-Parameter zu akzeptieren und die Datei zur Laufzeit zu rendern, z.