ASP.NET MVC在虚拟目录中

时间:2008-10-08 14:14:17

标签: c# asp.net-mvc model-view-controller iis-5

我的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有什么特殊注意事项吗?

4 个答案:

答案 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选项卡,然后输入相应的位置。