MVC模式下那些友好,屏蔽具体物理文件的URL让我眼馋,咱也想在WEB FORM项目用上一用。
按照指引,添加global.asax,写上路由代码什么的:
<%@ Application Language="C#" %> <%@ Import Namespace="System.Web.Routing" %> <script runat="server"> void Application_Start(object sender, EventArgs e) { // 在应用程序启动时运行的代码 RegisterRoutes(RouteTable.Routes); } public static void RegisterRoutes(RouteCollection routes) { routes.MapPageRoute("", "", "~/default.aspx"); routes.MapPageRoute("test", "h/{product}", "~/temp/test.aspx"); }
然后在VS2012里运行却可以,排除是路由写得不对的问题。
有大牛说,IIS7以前的版本,需要指定后缀名,加上.aspx,比如,应当用这种方式
routes.MapPageRoute("test", "h.aspx/{product}", "~/temp/test.aspx");
这说明,我这个IIS7.5里面,如果不指定.ASPX,根本没有经过ASP.NET的处理,路由不起作用。
这很奇怪,我的IIS是WIN7下的IIS7.5,应用程序池模式是集成,ASP.NET4.0,一切都符合传说中的“无须任何配置就可以直接使用ASP.NET路由”的条件。
难道是因为我装了微软的URL重写模块?卸载,重启,不行。
重新注册ASP.NET4.0,也是不行。
谁来告诉我?
======================================================================================
2013-09-11
洒家来告诉你。
只要在web.config里,<system.webServer>加上这句就可以鸟:
<system.webServer> <modules runAllManagedModulesForAllRequests="true" /> </system.webServer>
应用程序池的模式需要为集成模式。
如果是经典模式,则要使用后缀名了,路由中的路径如果没有特定后缀名的话,是到达不了ASP.NET处理这一层的。当然可以使用.aspx、.ashx、.asmx这样的后缀名,如:
routes.MapRoute( "test2", // 路由名称 "{controller}.aspx/{action}/{id}", // 带有参数的 URL new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 参数默认值 );
routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.IgnoreRoute("{resource}.aspx/{*pathInfo}");
可以使用.mvc:
routes.MapRoute( "test2", // 路由名称 "{controller}.mvc/{action}/{id}", // 带有参数的 URL new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 参数默认值 );
或者直接在web.config里写也是一样的:
<system.webServer> <handlers> <add name="MVC" path="*.mvc" verb="*" modules="IsapiModule" scriptProcessor="C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" preCondition="classicMode,runtimeVersionv4.0,bitness32" /> </handlers>