Wie fordern Sie statische HTML-Dateien im Ordner ~ / Views in ASP.NET MVC an?

92

Ich möchte statische .htmlDateien anfordern können, die sich im ~/ViewsOrdner befinden. Gemäß der Dokumentation prüft das Routing-System, ob eine URL mit einer Festplattendatei übereinstimmt, bevor die Routen der Anwendung ausgewertet werden.

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

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

Was habe ich vermisst?

alex.mironov
quelle

Antworten:

111

Ich möchte statische HTML-Dateien anfordern können, die sich im Ordner '~ / Views' befinden.

Das kannst du nicht. In diesem Ordner befindet sich eine web.config-Datei, die den Zugriff auf Dateien ausdrücklich untersagt. Wenn Sie vom Client aus auf Dateien zugreifen möchten, sollten diese Dateien nicht in dem ViewsOrdner abgelegt werden, der in ASP.NET MVC eine besondere Bedeutung hat.

Sie könnten einen ~/StaticOrdner haben, in dem Sie Ihre HTML-Dateien ablegen können. Und dann so darauf zugreifen:

http://example.com/yourapplicationname/static/foo.html
Darin Dimitrov
quelle
4
Anstatt Ihren Ordner "statisch" zu nennen, können Sie auch die Controller-Namensstruktur nachahmen, die sich im Ordner "Ansichten" befindet. Die URL hat also das gleiche "Erscheinungsbild". Zum Beispiel, da Sie Ihre plainjane Edit.html nicht in Views / Order / Edit.html ablegen können - Sie legen sie in ~ / Order / Edit.html
bkwdesign
2
Dies hat sich jetzt mit dem neuesten ASP.NET (vNext) geändert, bei dem Sie einen statischen Anbieter für HTML-Dateien registrieren und gleichzeitig den normalen MVC-Weg weiterleiten können. Hatte nur ein kurzes Spiel damit, aber das habe ich mit einem Testprojekt gemacht. Laufen durch Turmfalke unter Linux .. aber IIS sollte das gleiche sein, nehme ich an.
Piotr Kula
1
@bkwdesign Ich bin sicher, dass die Konfiguration, die durch Nachahmung der Ordnerstruktur gesteuert wird, den Standardhandler meines Controllers durcheinander gebracht und den Zugriff unmöglich gemacht hat. Testen Sie diese Situation.
Hunter-Orionnoir
78

Um Dateien wie js und html im Ordner "Ansichten" zuzulassen, bearbeiten Sie die Datei "web.config" im Ordner "Ansichten":

<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
quelle
1
Ich musste die Zeile "route.RouteExistingFiles = true;" entfernen. in RouteConfig.RegisterRoutes, damit dies funktioniert
Sam Sippe
Während die markierte Antwort nützliche Informationen enthält, ist dies die bessere Antwort. Getestet und arbeite in meinem aktuellen Projekt.
A. Murray
1
Was ist mit CSS-Dateien?
Leandro
@Darin Dimitrovs Antwort gibt eine Problemumgehung, aber dies sollte als Antwort markiert werden
Kunal
31

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

Ja, du kannst. Die markierte Antwort ist nicht ganz richtig, obwohl sie eine Lösung bietet.

Die Begründung in der markierten Antwort ist korrekt. Es ist web.config (BlockViewHandler-Einstellung, um genau zu sein) im Ordner "Ansichten", die den direkten Zugriff auf die Dateien verhindert. Es dient zum Sichern der Ansichten in Asp.Net MVC. Wenn Sie jedoch eine Frage zum direkten Bereitstellen dieser Dateien gestellt haben, haben Sie wahrscheinlich einen gültigen Grund dafür, z. B. die Verwendung von AngularJS-Teilansichten (wie in unserem Fall), bei denen wir den Ansichtsordner nicht mit seltsamen Namen duplizieren möchten.

Hier ist eine sehr einfache Änderung, die Sie in der Datei web.config im Ordner Ansichten vornehmen können, ohne die Sicherheit Ihrer asp.net mvc-Ansichten zu beeinträchtigen. Dadurch werden die CSHTML-Dateien wie gewohnt gesichert, Ihre HTML-Dateien bleiben jedoch in Ruhe

Ändere das

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

--zu--

<add name="BlockViewHandler" path="*.cshtml" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler" />
Vikas
quelle
3
Dies kann bei anderen Dateien wie ASPX- oder ASCX-Dateien oder Dateien aus View-Engines von Drittanbietern immer noch gefährlich sein. Viel besser auf der Whitelist gemäß der Antwort von cs3x.
pwdst
1
@pwdst: Wenn Sie eine Mischung aus serverseitigen Ansichten verwenden, ist es möglicherweise besser, einzelne Typen auf die Whitelist zu setzen. Wir wollen nur die .cshtml-Dateien schützen, deshalb haben wir dies verwendet, da es etwas weniger ausführlich ist.
Vikas
14

Eine andere alternative Option besteht darin, eine Aktionsmethode in einen der gewünschten Controller einzufügen, um die HTML-Datei bereitzustellen

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

Greifen Sie auf das HTML als http: // Ihre Site / Controller / MyHtml zu . Sie können diese Aktionsmethode erweitern, um den HTML-Dateinamen als Parameter method / querystrign zu akzeptieren und die Datei zur Laufzeit zu rendern, z. B. so etwas.

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

Wenn Sie planen, den Ordner "Inside View" zu verwenden, sollten die obigen Antworten am besten sein. Diese Antwort kann jedoch für Benutzer nützlich sein, die auf asp.net mvc core migrieren. Durch das Platzieren von Dateien in wwwroot anstelle des Ansichtsordners sollten Ihre HTML-Seiten problemlos als localhost / myfile.html zugänglich sein

Kurkula
quelle