5

I am trying to access a .js file in the views directory. I have an MVC application with /Views/Home/MyControl.ascx I have a js file /Views/Home/MyControl.js

I wish to reference the .js file and keep it with the control. I have tried the following entries in the routing, and none seem to work.

        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.IgnoreRoute("{file}.js");
        routes.IgnoreRoute("{resource}.js/{*pathInfo}");
        routes.IgnoreRoute("{controller}/{resource}.js/{*pathInfo}");
        routes.IgnoreRoute("{*alljs}", new { alljs = @".*\.js(/.*)?" });

Please help, please don't suggest adding the .js file to the scripts directory. I would like to make it work this way, or know why it cannot be done.

I would put the script into the page, only script debugging is broken in VS2010 B2.

Thanks Regards Craig.

Joel Coehoorn
  • 399,467
  • 113
  • 570
  • 794
Craig
  • 83
  • 1
  • 6
  • You're simply just doing it wrong if you don't want to place your scripts in the scripts folder, unless you can explain why you want to differ from that standard. – Zimano Aug 24 '23 at 08:19

4 Answers4

8

The Views folder is, well for views, and javascript should be put elsewhere. That's why the designers of the MVC framework put a web.config in this Views folder that denies access to any file inside. You could modify this defaut setting but be warned that this could be a potential security hole. So open the web.config file located in the Views folder and:

Replace:

<httpHandlers>
  <add path="*" verb="*" type="System.Web.HttpNotFoundHandler"/>
</httpHandlers>

with:

<httpHandlers>
  <add path="*.aspx" verb="*" type="System.Web.HttpNotFoundHandler"/>
  <add path="*.master" verb="*" type="System.Web.HttpNotFoundHandler"/>
  <add path="*.ascx" verb="*" type="System.Web.HttpNotFoundHandler"/>
</httpHandlers>

Navigate to http://yoursite/Views/test.js

P.S. You could also remove all the IgnoreRoutes you put in global.asax.

Darin Dimitrov
  • 1,023,142
  • 271
  • 3,287
  • 2,928
  • Thanks for the help. This does sound wrong. What if I put the javascript with the controller, would that be a better approach. I don't really want it in the general scripts folder. Would I need the IgnoreRoute for that to work? – Craig Nov 20 '09 at 04:22
  • I know this is an old post, but holy crap this just helped me after 4+ hours of tearing my hair out. I wish I could upvote this 20 times! – rossipedia Dec 11 '12 at 04:52
6

Wouldn't this be a better solution using the DefaultHttpHandler for html resources and keeping the HttpNotFoundHandler for all other types of file

<httpHandlers>  
  <add path="*.html" verb="*" type="System.Web.DefaultHttpHandler"/> 
  <add path="*.*" verb="*" type="System.Web.HttpNotFoundHandler"/> 
</httpHandlers> 
1

Actually for IIS integrated mode, you need to use System.Web.StaticHttpHandler:

<httpHandlers>
  <add path="*.css" verb="*" type="System.Web.StaticHttpHandler"/> 
  <add path="*.js" verb="*" type="System.Web.StaticHttpHandler"/> 
  <add path="*.*" verb="*" type="System.Web.HttpNotFoundHandler"/> 
</httpHandlers>

Apparently System.Web.DefaultHttpHandler works in IIS classic mode only.

lnaie
  • 1,011
  • 13
  • 16
0

In MVC 4 I had to update the handler section as well as the httpHandlers section.

I updated the web.config in the Views folder with the following.

<httpHandlers>
  <add path="*.aspx" verb="*" type="System.Web.HttpNotFoundHandler"/>
  <add path="*.cshtml" verb="*" type="System.Web.HttpNotFoundHandler"/>
</httpHandlers>

<handlers>
  <remove name="BlockViewHandler" />
  <add name="BlockViewHandlerRazor" path="*.cshtml" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler" />
  <add name="BlockViewHandlerAspx" path="*.aspx" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler" />
</handlers>
Dan H
  • 1,828
  • 2
  • 21
  • 38