我的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有什么特殊注意事项吗?
答案 0 :(得分:4)
IIS 5.1解释您的网址,使其在名为Test的文件夹下查找名为1000的文件夹。为什么会这样?
这是因为只有IIS 6 在看到ASP.NET时调用ASP.NET URL中的“文件扩展名” 映射到aspnet_isapi.dll(这是一个 C / C ++ ISAPI过滤器负责 调用ASP.NET)。由于路由是一个 .NET IHttpModule调用 UrlRoutingModule,它没有得到 除非ASP.NET本身获得,否则调用 调用,只发生在 aspnet_isapi.dll被调用,哪个 只有在.aspx中才会发生 URL。所以,没有.aspx,没有 UrlRoutingModule,因此404。
最简单的解决方案是:
如果你不介意在你的.aspx 网址,只需通过您的路由 配置,在a之前添加.aspx 每种模式中的正斜杠。对于 例如,使用 {controller} .aspx / {action} / {id}或 myapp.aspx / {控制器} / {行动} / {ID}。 不要把.aspx放在里面 花括号参数名称,或者 '默认'值,因为它不是 真的是控制器名称的一部分 - 它只是在满足IIS的URL中。
来源:http://blog.codeville.net/2008/07/04/options-for-deploying-aspnet-mvc-to-iis-6/
答案 1 :(得分:2)
如果您在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,控制器和操作部分不是可选的。
答案 2 :(得分:1)
在应用程序中使用虚拟目录时需要考虑许多因素。
一个特别的是,即使应用程序驻留在同一服务器上,大多数浏览器也不会将来自一个虚拟目录的cookie提交到另一个虚拟目录。
答案 3 :(得分:1)
尝试设置虚拟路径:右键单击mvc项目,属性,web选项卡,然后输入相应的位置。