Comment demander des fichiers .html statiques dans le dossier ~ / Views dans ASP.NET MVC?

92

Je veux pouvoir demander des .htmlfichiers statiques qui se trouvent dans le ~/Viewsdossier. Selon la documentation, le système de routage vérifie si une URL correspond à un fichier disque avant d'évaluer les routes de l'application.

Mais lorsque je demande le fichier, une 404erreur survient.

Mon fichier se trouve dans le dossier ~ / Views. L'URL est:http://[localhost]/Views/HtmlPage1.html

Qu'est-ce que j'ai manqué?

alex.mironov
la source

Réponses:

111

Je veux pouvoir demander des fichiers .html statiques qui se trouvent dans le dossier '~ / Views'.

Vous ne pouvez pas. Il y a un fichier web.config dans ce dossier qui interdit explicitement l'accès à tout fichier à partir de celui-ci. Si vous souhaitez pouvoir accéder aux fichiers à partir du client, ces fichiers ne doivent pas être placés dans le Viewsdossier qui a une signification particulière dans ASP.NET MVC.

Vous pourriez avoir un ~/Staticdossier dans lequel vous pourriez placer vos fichiers HTML. Et puis accédez-y comme ça:

http://example.com/yourapplicationname/static/foo.html
Darin Dimitrov
la source
4
Ou, au lieu de nommer votre dossier «statique», vous pouvez imiter la structure du nom du contrôleur qui se trouve dans le dossier Views .. afin que l'URL ait la même «apparence». Par exemple, puisque vous ne pouvez pas mettre votre plainjane Edit.html dans Views / Order / Edit.html - vous le mettez dans ~ / Order / Edit.html
bkwdesign
2
Cela a maintenant changé avec le dernier ASP.NET (vNext) où vous pouvez enregistrer un fournisseur statique pour les fichiers html mais aussi toujours acheminer le chemin MVC normal. Je n'ai eu qu'un jeu rapide avec mais c'est ce que j'ai fait avec un projet de test. Traversant Kestrel sous Linux .. mais IIS devrait être le même, je suppose.
Piotr Kula
1
@bkwdesign Je suis sûr que sa configuration contrôlée en imitant la structure des dossiers a gâché le gestionnaire par défaut de mes contrôleurs et l'a rendu inaccessible. Alors testez cette situation.
Hunter-Orionnoir
78

Pour autoriser les fichiers comme js et html dans le dossier Views, modifiez le fichier web.config dans 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>

cs3x
la source
1
J'ai dû supprimer la ligne "routes.RouteExistingFiles = true;" in RouteConfig.RegisterRoutes for this to work
Sam Sippe
Bien que la réponse marquée contienne des informations utiles, c'est la meilleure réponse. Testé et travaillant dans mon projet actuel.
A. Murray
1
Qu'en est-il des fichiers css?
Leandro le
La réponse de @Darin Dimitrov donne une solution de contournement, mais cela devrait être marqué comme la réponse
Kunal
31

Je veux pouvoir demander des fichiers .html statiques qui se trouvent dans le dossier ~ / Views.

Bien, vous pouvez. La réponse marquée n'est pas entièrement correcte, même si elle donne une solution.

Le raisonnement dans la réponse marquée est correct, c'est web.config (paramètre BlockViewHandler pour être spécifique) dans le dossier Views qui empêche l'accès direct aux fichiers. Il est là pour sécuriser les vues dans Asp.Net MVC. Mais si vous avez posé une question sur la diffusion directe de ces fichiers, vous avez probablement une raison valable de le faire, comme l'utilisation de vues partielles AngularJS (comme dans notre cas) où nous ne voulons pas dupliquer le dossier de vues avec des noms étranges.

Voici donc un ajustement très simple que vous pouvez faire dans le fichier web.config qui se trouve dans le dossier Views, sans compromettre la sécurité de vos vues asp.net mvc. Cela sécurisera les fichiers .cshtml comme d'habitude, mais laissera vos fichiers .html seuls.

Change ça

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

--à--

<add name="BlockViewHandler" path="*.cshtml" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler" />
Vikas
la source
3
Cela peut toujours être dangereux avec d'autres fichiers tels que les fichiers .aspx ou .ascx ou ceux provenant de moteurs de visualisation tiers. Beaucoup mieux de mettre sur liste blanche selon la réponse de cs3x.
pwdst
1
@pwdst: Si vous utilisez un mélange de vues côté serveur, oui, la liste blanche de types individuels pourrait être préférable. Nous voulons juste protéger les fichiers .cshtml, nous l'avons donc utilisé car il est un peu moins détaillé.
Vikas
14

Une autre option consiste à insérer une méthode d'action dans l'un des contrôleurs souhaités pour servir le fichier html

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

Accédez au html en tant que http: // yoursite / controller / MyHtml . Vous pouvez étendre cette méthode d'action pour accepter le nom du fichier html en tant que paramètre method / querystrign et rendre le fichier au moment de l'exécution, par exemple quelque chose comme ça.

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

Si vous envisagez d'utiliser le dossier de vue interne, les réponses ci-dessus devraient être les meilleures, mais cette réponse peut être utile pour les utilisateurs qui migrent vers asp.net mvc core. Placer les fichiers dans wwwroot au lieu du dossier views devrait faciliter l'accès à vos pages html en tant que localhost / myfile.html

Kurkula
la source