2013-07-04 49 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();之前從所有名稱空間加載控制器(如果您只是包含引用,這沒有問題,如果您動態加載引用,則只會成爲問題) 。