10

我的 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

4 回答 4

4

IIS 5.1 会解释您的 url,以便它在名为 Test 的文件夹下寻找名为 1000 的文件夹。为什么呢?

发生这种情况是因为 IIS 6 仅当它在映射到 aspnet_isapi.dll(这是一个负责调用 ASP.NET 的 C/C++ ISAPI 过滤器)的 URL 中看到“文件扩展名”时才调用 ASP.NET。由于路由是一个名为 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 放在大括号参数名称中或“默认”值中,因为它实际上并不是控制器名称的一部分 - 它只是在满足 IIS 的 URL 中。

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

于 2008-10-26T10:26:09.937 回答
2

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

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

于 2008-10-11T12:40:23.707 回答
1

在应用程序中使用虚拟目录时有许多注意事项。

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

于 2008-10-08T14:18:12.803 回答
1

尝试设置虚拟路径:右键单击mvc项目,属性,Web选项卡,输入适当的位置。

于 2008-10-08T18:03:49.527 回答