alex.mironov
alex.mironov

Reputation: 2942

How do you request static .html files under the ~/Views folder in ASP.NET MVC?

I want to be able to request static .html files which are located in the ~/Views folder. According to the documentation, the routing system checks to see if a URL matches a disk file before evaluating the application's routes.

But when I request the file a 404 error arises.

My file is located in ~/Views folder. The URL is: http://[localhost]/Views/HtmlPage1.html

What have I missed?

Upvotes: 96

Views: 97379

Answers (6)

gharel
gharel

Reputation: 573

You can place it in the /Content folder.

Upvotes: 0

Kurkula
Kurkula

Reputation: 6762

If you are planning to use inside view folder, above answers should be best but this answer may be useful for users who are migrating to asp.net mvc core. Placing files in wwwroot instead of views folder should make your html pages access easily as localhost/myfile.html

Upvotes: 1

Venkatesh Muniyandi
Venkatesh Muniyandi

Reputation: 5640

Another alternate option is to insert an action method in any of the desired controller to serve the html file

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

Access the html as http://yoursite/controller/MyHtml. You may extend this action method to accept the html file name as method/querystrign parameter and render the file at run time, e.g something like this.

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

Upvotes: 17

cs3x
cs3x

Reputation: 791

To allow files like js and html in Views folder edit the 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>

Upvotes: 79

Vikas
Vikas

Reputation: 449

I want to be able to request static .html files which are located in the ~/Views folder.

Well you can. The marked answer is not entirely correct, although it gives a solution.

The reasoning in the marked answer is correct, it is web.config (BlockViewHandler setting to be specific) in the Views folder that prevents the files to be accessed directly. It is there for securing the views in Asp.Net MVC. But if you asked a question about serving these files directly then you likely have a valid reason to do so, like using AngularJS partial views (as in our case) where we do not want to duplicate the views folder with weird names.

So here is a very simple tweak you can do in the web.config file found in the Views folder, without compromising security of your asp.net mvc views. This will secure the .cshtml files as usual but leave your .html files alone.A

Change this

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

--to--

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

Upvotes: 31

Darin Dimitrov
Darin Dimitrov

Reputation: 1038930

I want to be able to request static .html files which are located in the '~/Views' folder.

You can't. There's a web.config file in this folder which explicitly forbids accessing any file from it. If you want to be able to access files from the client those files should not be placed in the Views folder which has a special meaning in ASP.NET MVC.

You could have a ~/Static folder where you could place your HTML files. And then access it like that:

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

Upvotes: 114

Related Questions