ASP.Net MVC 4.在单独的程序集中路由控制器返回错误404

时间:2013-07-04 13:44:37

标签: asp.net-mvc routing

我正在尝试执行看似简单的任务 - 从我项目中的单独程序集调用控制器。

然而,当我从该控制器请求信息时,我收到错误404.我在过去5-6小时内一直在与它斗争,我怀疑我可能会遗漏一些小而明显的东西,这就是为什么我希望建议。

我在stakoverflow上发现了关于路由和错误404的类似问题,但是当我实现另一个原型项目时,我没有得到这样的错误并使用类似的代码结构,我相信他们描述的问题与我的不同。 / p>

总体而言 - 我想要实现的目标的总体目标是在独立项目中实现一个区域,如here所述。 我做了所有类似的事情,在链接中解释了一个小型原型(并且它工作正常),现在尝试申请真正的项目。

这是我包含程序集和管理路径的方式:

  1. 有一个主要项目,其中一个区域代表一个隐藏的子项目“CommunicationBus”
  2. “CommunicationBus”项目包含一个“CommunicationBusAreaRegistration”类。注册路由工作正常,我可以使用调试器到这里,当我使用routedebugger时我也可以看到这条路线(见下面的截图)。我也玩过这个类的命名空间,最后尝试添加.Areas.CommunicationBus,但它没有任何区别我注意到了。

    namespace MBVD.MainProject.UI
    {
        public class CommunicationBusAreaRegistration : AreaRegistration
        {
            public override string AreaName
            {
                get
                {
                    return "CommunicationBus";
                }
            }
    
            public override void RegisterArea(AreaRegistrationContext context)
            {
                context.MapRoute(
                    "CommunicationBus_default",
                    "CommunicationBus/{controller}/{action}/{id}",
                    new { action = "Index", id = UrlParameter.Optional },
                    new string[] { "CommunicationBus.Controllers" }
                );
            }
        }
    }
    
  3. 在主项目的Global.asax中,我按以下方式注册路线:

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

    如果我在这里引用“CommunicationBus.Controllers”,我就不能再打开主应用程序的页面了。但是,我认为我只需要在这里注册主应用程序控制器的路径

  4. CommunicationBus项目的输出路径设置为主项目的bin文件夹。每次我构建CommunicationBus时,我都会在主项目中获得一个新的.dll。

  5. 我在CommunicationBus项目中添加了一个简单的控制器:

    namespace CommunicationBus.Controllers
    {
        public class TestController : Controller
        {
            [HttpGet]
            public string Index()
            {
                return "It works!";
            }
        }
    }
    
  6. 我添加了一个指向主项目的链接

     @Html.ActionLink("test","Index","Test", new {Area="CommunicationBus"}, null)
    

    是:

    本地主机:63254 / CommunicationBus /测试

  7. 我使用routedebugger并没有显示任何可疑内容:

  8. routedebugger

    我将ASP.NET MVC 4用于这两个项目。

    我很感激我能做些什么来弄清楚为什么我会收到这个错误。

1 个答案:

答案 0 :(得分:0)

我相信您因路由顺序而收到此错误。由于/CommunicationBus/Test匹配/{controller}/{action}/{id}/CommunicationBus/{controller}/{action}/{id},因此第一个注册路由(/{controller}/{action}/{id})优先于所需路由,并且MVC无法在默认命名空间中找到控制器(MBVD.MainProject.UI.Controllers)名为CommunicationBus

尝试在默认路线之前注册您的区域路线。或者,您可以一起跳过该业务并使用属性路由(http://blogs.msdn.com/b/webdev/archive/2013/10/17/attribute-routing-in-asp-net-mvc-5.aspx)。如果你使用属性路由,你需要确保在调用routes.MapMvcAttributeRoutes();之前从所有命名空间加载控制器(如果你只是作为参考包括,这没有问题,如果你是动态的,它只会成为一个问题加载参考)。