2011-12-13 36 views
3

叫我有一些地區在我的ASP.NET MVC3應用:區域控制器正在從根本要求

namespace MyProject.Areas.myarea 
{ 
    public class myareaAreaRegistration : AreaRegistration 
    { 
     public override string AreaName 
     { 
      get 
      { 
       return "myarea"; 
      } 
     } 

     public override void RegisterArea(AreaRegistrationContext context) 
     { 
      context.MapRoute(
       "myarea_default", 
       "myarea/{controller}/{action}/{id}", 
       new { action = "Index", id = UrlParameter.Optional } 
      ); 
     } 
    } 
} 

這個區域包含與「微笑」行動「你好」控制器。

在爲整個項目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 } 
     ); 

    } 

    protected void Application_Start() 
    { 
     AreaRegistration.RegisterAllAreas(); 

     RegisterGlobalFilters(GlobalFilters.Filters); 
     RegisterRoutes(RouteTable.Routes); 
    } 

所以,當我要求 「本地主機/ myarea/hello /的微笑」,它調用預期適當的控制器。

但是!當我請求「localhost/hello/smile」時,它會調用hello控制器STILL!因此,它不在myarea/Views文件夾中查找視圖,而是在〜/ Views文件夾中查找「root」(非區域)級別的項目。

我該如何解決這個問題,所以服務器會拋出一個404異常,找不到資源,就像我要求的不存在的控制器一樣?

UPD:控制器面積在命名空間:

namespace MyProject.Areas.myarea.Controllers 
{ 
    public class HelloController : Controller 

... 
} 

控制器中的 「根」 級是在命名空間:

namespace MyProject.Controllers 
{ 
    public class AnotherRootController : Controller 
... 
} 

所以我在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 [] { "MyProject.Controllers" } //Namespace 
     ); 

    } 

我認爲這會限制這條路徑爲「根」-l僅限於evel控制器,因爲它們位於MyProject.Controllers命名空間中。這沒有用。區域控制器仍然在被請求調用,而沒有再次調用。

可能有人能解釋,爲什麼?

+1

在MVC4 「默認」 路線declaraton從Global.asax中移動到〜/ App_Start/RouteConfig.cs /的RegisterRoutes() –

回答

7

在Global.asax中註冊默認路由時,您可以設置UseNamespaceFallback=false datatoken,方法是限制它只查看給定名稱空間中的控制器。你可以看看following blog post

所以把那個付諸行動添加命名空間限制您的域名註冊:爲了它限制在給定的註冊默認路由時

public override void RegisterArea(AreaRegistrationContext context) 
{ 
    context.MapRoute(
     "myarea_default", 
     "myarea/{controller}/{action}/{id}", 
     new { action = "Index", id = UrlParameter.Optional }, 
     new[] { "MyProject.Areas.myarea.Controllers" } 
    ); 
} 

,並在您Global.asax設置UseNamespaceFallback數據令牌假名稱空間:

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[] { "MyProject.Controllers" } 
    ).DataTokens["UseNamespaceFallback"] = false; 
} 
+0

這工作100%。非常感謝Darin! – Roman

+0

這也幫助我解決了註冊默認路由的問題,我希望它在給定區域查看Views。 (使用默認路由時,區域令牌未註冊)。使用DataTokens訪問器設置「區域」的值就像魅力一樣工作。這被我看到的一些評論者認爲是一個錯誤(即使框架不應該支持這一點)。所以感謝Darin。 – M05Pr1mty

相關問題