IgnoreRoute in ASP.MVC

7.7k views Asked by At

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.

4

There are 4 answers

2
Darin Dimitrov On BEST ANSWER

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.

0
lnaie On

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.

0
Clement-Edwin ALBERT On

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> 
0
Dan H On

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>