IgnoreRoute in ASP.MVC
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开发者_如何学Go, 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.
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
.
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>
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.
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>
精彩评论