【问题标题】:ASP.NET MVC Routing - differences in web site vs virtual directoryASP.NET MVC 路由 - 网站与虚拟目录的差异
【发布时间】:2012-03-07 14:39:41
【问题描述】:

我有一个带有可移植区域的 ASP.NET MVC 3 应用程序(在 IIS 7.5 中)。当我在网站中托管使用​​便携式区域的应用程序时,我的路由可以完美运行,例如

http://localhost:9001/Clearance/Home/Search(有效)

但是,当托管在虚拟目录中时,例如

http://localhost/Acme.Risks.Clearance.Web.Area.TestUI/Clearance/Home/Search(这不起作用)

我收到以下错误:

找到了与名为“Home”的控制器匹配的多种类型。如果服务此请求的路由 ('Clearance/{controller}/{action}') 未指定命名空间来搜索与请求匹配的控制器,则可能会发生这种情况。如果是这种情况,请通过调用带有“namespaces”参数的“MapRoute”方法的重载来注册此路由。

我不明白为什么,我指定的命名空间在网站中运行时可以正常工作。

这是我的便携式区域注册:

    public override void RegisterArea(AreaRegistrationContext context, IApplicationBus bus)
    {
        if (context == null)
        {
            throw new ArgumentNullException("context");
        }

        base.RegisterArea(context, bus);
        context.MapRoute(
            RouteName.ClearanceAreaDefault, 
            this.AreaName + "/{controller}/{action}/{id}", 
            new { controller = "Home", action = "Search", id = UrlParameter.Optional },
            new[] { typeof(HomeController).Namespace });
    }

这是虚拟目录中 Web 应用程序的 Global.asax(不起作用):

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.MapRoute(
            "Default",
            "{controller}/{action}/{id}",
            new { controller = "Home", action = "Index", id = UrlParameter.Optional },
            new[] { typeof(HomeController).Namespace });
    }

这是网站中 Web 应用程序的 Global.asax(确实有效):

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.MapRoute(
            "Default",
            "{controller}/{action}/{id}",
            new { controller = "Home", action = "Index", id = UrlParameter.Optional },
            new[] { "Acme.Risks.Web.UI.Controllers" });
    }

我使用了 Phil Haack 的“RouteDebugger”(http://nuget.org/packages/routedebugger),两个请求的路由调试信息是相同的。

有人知道为什么会这样吗?

谢谢,

卡勒姆

【问题讨论】:

    标签: asp.net-mvc-3 routes


    【解决方案1】:

    这取决于 MVC 的数据上下文中使用的命名空间。

    我的网络区域程序集是“Acme.Risks.Clearance.Web.Area”。

    我的网站程序集是“Acme.Risks.Web.UI”(工作)。

    我的网络区域测试 UI 程序集是“Acme.Risks.Clearance.Web.Area.TestUI”(不工作)。

    数据上下文中使用的命名空间是“Acme.Risks.Clearance.Web.Area*”,因此在 Web 区域测试 UI 的情况下,通配符会导致两个匹配项。因此,即使路由信息相同,ASP.NET MVC 也无法确定哪个是正确的程序集,因为存在重复匹配项。

    【讨论】:

      猜你喜欢
      • 2011-06-24
      • 2011-03-18
      • 2011-11-22
      • 1970-01-01
      • 1970-01-01
      • 2012-03-29
      • 2010-09-16
      • 1970-01-01
      • 2011-08-23
      相关资源
      最近更新 更多