ASP.NET MVC在虚拟目录中

我在Global.asax.cs中有以下内容

routes.MapRoute( "Arrival", "{partnerID}", new { controller = "Search", action = "Index", partnerID="1000" } ); routes.MapRoute( "Default", "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = "" } ); 

我的SearchController看起来像这样

 public class SearchController : Controller { // Display search results public ActionResult Index(int partnerID) { ViewData["partnerID"] = partnerID; return View(); } } 

而Index.aspx目前只显示ViewData [“partnerID”]。

我在Windows XP上的IIS中设置了一个名为Test的虚拟目录。

如果我将浏览器指向http:// localhost / Test /,那么我会按预期显示1000。 但是,如果我尝试http:// localhost / Test / 1000我得到一个页面未找到错误。 有任何想法吗?

在虚拟目录中运行MVC有什么特殊注意事项吗?

IIS 5.1解释您的URL,使其在名为Test的文件夹下查找名为1000的文件夹。 为什么会这样?

发生这种情况是因为IIS 6在URL中看到“文件扩展名”时才调用ASP.NET,该URL映射到aspnet_isapi.dll(这是一个负责调用ASP.NET的C / C ++ ISAPIfilter)。 由于路由是名为UrlRoutingModule的.NET IHttpModule,因此除非调用ASP.NET本身,否则不会调用它,只有在调用aspnet_isapi.dll时才会调用,只有在URL中有.aspx时才会发生。 所以,没有.aspx,没有UrlRoutingModule,因此404。

最简单的解决方案是:

如果您不介意在URL中使用.aspx,只需浏览路由配置,在每个模式的正斜杠之前添加.aspx。 例如,使用{controller} .aspx / {action} / {id}或myapp.aspx / {controller} / {action} / {id}。 不要将.aspx放在花括号参数名称中,或放入’default’值,因为它实际上不是控制器名称的一部分 – 它只是在满足IIS的URL中。

资料来源: http : //blog.codeville.net/2008/07/04/options-for-deploying-aspnet-mvc-to-iis-6/

如果您在Windows XP上执行此操作,那么您使用的是IIS 5.1。 您需要让ASP.Net来处理您的请求。 您需要为路由添加扩展名({controller} .mvc / {action} / {id})并将该扩展名映射到ASP.Net或将所有请求映射到ASP.Net。 http:// localhost / Test有效,因为它转到Default.aspx,这是在MVC项目中专门处理的。

此外,您需要指定http:// localhost / Test / Search / Index / 1000 。 如果要指定ID,则控制器和操作部件不是可选的。

在应用程序中使用虚拟目录时需要考虑许多因素。

一个特别的是,即使应用程序驻留在同一服务器上,大多数浏览器也不会将来自一个虚拟目录的cookie提交到另一个虚拟目录。

尝试设置虚拟路径:右键单击mvc项目,属性,web选项卡,然后输入相应的位置。