C# 当文件实际存在于指定位置时的MVC路由
因此,在IIS 7下运行的MVC 3应用程序中,我有这样一个路由:C# 当文件实际存在于指定位置时的MVC路由,c#,asp.net-mvc,routing,C#,Asp.net Mvc,Routing,因此,在IIS 7下运行的MVC 3应用程序中,我有这样一个路由: routes.MapRoute( "VirtualTourConfig", "virtualtour/config.xml", new { controller = "VirtualTour", action = "Config" } ); 诀窍在于文件实际上存在于/virtualtoor/config.xm
routes.MapRoute(
"VirtualTourConfig",
"virtualtour/config.xml",
new { controller = "VirtualTour", action = "Config" }
);
诀窍在于文件实际上存在于/virtualtoor/config.xml。看起来请求只是在该位置返回xml文件,而不是点击路由,路由处理xml,进行一些更改并返回自定义的XmlResult
如果文件存在于磁盘上,我如何告诉应用程序点击路由而不是实际文件,有什么建议吗
编辑:似乎我可以使用
routes.routeeExistingFiles=true在Global.asax的registerOutes方法中的code>,告诉应用程序忽略磁盘上的文件。但是,这会全局设置标志,并中断应用程序中的许多其他请求。例如,我仍然希望调用/assets/css/site.css返回css文件,而不必为每个静态资产专门设置路由。现在的问题是,有没有一种方法可以在每个路由的基础上实现这一点?到目前为止,我找到的最佳答案是全局应用路由。routeeExistingFiles=true
,然后有选择地忽略我想要传递到现有文件(如.js、.css等)的路由。因此,我最终得到了这样的结果:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.IgnoreRoute("*.js|css|swf");
routes.RouteExistingFiles = true;
routes.MapRoute(
"VirtualTourConfig",
"virtualtour/config.xml",
new { controller = "VirtualTour", action = "Config" }
);
}
如果有人有更好的解决方案,我想看看。我更喜欢有选择地将“RouteExistingFIles”标志应用于各个路由,但我不知道是否有办法做到这一点。这里没有解决方案,只是一个想法
您可以尝试实现基于您自己的解决方案,它将提供您自己的Web路径映射到文件系统路径,并使用缺省提供程序来解决所有您不想处理的路径。
< P>一个非常简单的解决方案,当然,如果您考虑史葛的答案,将是EG:<代码>路由。IgnoreRoute(“模板/*.html”);代码>,,
routes.IgnoreRoute(“scripts/*.js”)代码>和路由.IgnoreRoute(“style/*.css”)代码>
这使您既可以简单地向RouteCollection提供路径,又可以避免启动VirtualPathProvider等工作 您可以试试,例如:
我不认为有一个简单的方法来实现这一点。为什么不将静态文件移动到~/App\u Data
文件夹中?
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="VirtualTourConfig">
<match url="^virtualtour/config.xml" />
<action type="Rewrite" url="virtualtour/config" />
</rule>
</rules>
</rewrite>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="Dashboard">
<match url="^dashboard/(.+)" />
<action type="Rewrite" url="ng/dashboard/{R:1}" />
</rule>
</rules>
</rewrite>