2013-07-04 46 views
5

我想执行什么看起来像一个简单的任务 - 从调用一个单独的程序在我的项目的控制器。ASP.Net MVC 4在单独的程序路由控制器返回错误404

但是,当我向控制器请求信息时,我得到了404错误。我一直在为它工作5-6个小时,我怀疑我可能错过了一些小而明显的东西,这就是为什么我希望建议。

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

对于一般的画面 - 什么,我想实现像它描述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”,我主要的不再能打开网页应用。但是,我相信,我只需要在这里路径注册到主申请CommunicationBus项目

  4. 输出路径设置为主要项目的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,并没有表现出任何可疑:

routedebugger

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

我很感激任何想法,我可以做什么来弄清楚为什么我得到这个错误。

回答

0

我相信你因为你的路由顺序而得到这个错误。由于/CommunicationBus/Test/{controller}/{action}/{id}/CommunicationBus/{controller}/{action}/{id}都匹配,所以第一条注册路由(/{controller}/{action}/{id})优先于所需路由,并且MVC在默认名称空间(MBVD.MainProject.UI.Controllers)中找不到名为CommunicationBus的控制器。

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