我在我的应用程序中使用ASP.NET MVC 用户可以通过在页面上包含它们来指定自己的图像,样式和脚本 但是当他们指定不存在的文件的URL时,路由机制会尝试通过URL查找控制器和操作图像或样式等。
我添加了一个方法IgnoreRoute并指定了我不希望通过路由处理的所有扩展。
它正常工作,直到URL不以“Views / ...”开头 在这种情况下,URL传入应用程序并在应用程序内执行错误404 但我想用IIS处理这个错误。
这可以使用空项目进行测试。 您只需将此代码用于Global.asax.cs文件:
using System;
using System.Web.Mvc;
using System.Web.Routing;
namespace MvcApplication1
{
public class MvcApplication : System.Web.HttpApplication
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.IgnoreRoute(
"{*staticfile}",
new { staticfile = @".*\.(jpg|gif|jpeg|png|js|css|htm|html|htc)$" }
);
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = "" } // Parameter defaults
);
}
protected void Application_Start()
{
RegisterRoutes(RouteTable.Routes);
}
void Application_Error(object sender, EventArgs e)
{
}
}
}
现在我们需要在IIS上托管此应用程序,例如http://localhost/testmvc/
您可以在Application_Error方法中放置一个断点,以查看何时在应用程序内执行错误
现在打开测试网址:
http://localhost/testmvc/test.css
我们可以看到IIS处理了该错误:
现在我们在路径中打开另一个带有“/ Views / ...”的测试网址:
http://localhost/testmvc/Views/test.css
我们看到该错误由ASP.NET处理:
所以问题是:可能存在一些设置告诉MVC不在路径中使用“Views”处理URL?
答案 0 :(得分:3)
默认情况下,MVC不允许您直接寻址/ Views文件夹下的项目,因为所有文件类型都映射到System.Web.HttpNotFoundHandler。
要解决此问题,请在/Views/web.config中更改您的定义,告诉它基本上忽略该位置中的所有其他内容
<add path="*.cshtml" verb="*" type="System.Web.HttpNotFoundHandler"/>
我写了一篇基于此的博客条目,因为如果要包含多种文件类型,IIS 6与7不同。看到: http://completedevelopment.blogspot.com/2011/06/using-views-outside-of-views-or-other.html
答案 1 :(得分:3)
以下是我的方式:
1-在Views文件夹中创建一个新文件夹,例如。 MyFolder中
2-将静态页面添加到此新文件夹中,例如。 filename.cshtml
3-从“Views”文件夹中复制web.config文件并将其粘贴到刚才的新文件夹中 创建(myFolder)
4-在新的web.config中替换 这个:
<add path="*.*" verb="*" type="System.Web.HttpNotFoundHandler"/>
用这个:
<add path="*.*" verb="*" type="System.Web.DefaultHttpHandler"/>
5-如果找到它,请删除这些行:
<remove name="BlockViewHandler"/>
<add name="BlockViewHandler" path="*" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler" />
Resault: 现在,此文件夹中的任何文件都可以正常运行而无需路由!