2013-06-20 25 views
9

我想在MVC應用程序中使用區域,我希望默認路由將被解析到管理區域內的HomeController,但它解析爲根站點中的家庭控制器。 我添加了admin HomeController的命名空間,但它仍然解析爲根HomeController。MVC4使用區域時的默認路由

我的路由配置:

public class RouteConfig 
{ 
    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[] {"MvcApplicationAreas.Areas.Admin.Controllers"} 

     ); 
    } 
} 

管理區域航線

public class AdminAreaRegistration : AreaRegistration 
{ 
    public override string AreaName 
    { 
     get 
     { 
      return "Admin"; 
     } 
    } 

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

的HomeController - 管理區

namespace MvcApplicationAreas.Areas.Admin.Controllers 
{ 
    public class HomeController : Controller 
    { 

     public ActionResult Index() 
     { 
      return View(); 
     } 

    } 
} 

任何想法,爲什麼它不會妥善解決? 謝謝

+0

你能還份額你的管理HomeController? – neontapir

+0

檢查這個帖子http://stackoverflow.com/questions/2140208/how-to-set-a-default-route-to-an-area-in-mvc –

+0

我看到帖子,但它的MVC2,從Pro MVC4書_「這個改變可以確保主項目中的控制器在解決請求時具有優先權,當然,如果你想優先考慮某個區域中的控制器,你可以這樣做。」_它看起來像通過聲明命名空間它應該路由到正確的HomeController – spooti

回答

9

我測試了你的區域註冊代碼,它的工作原理和選擇正確的控制器。但是,即使使用了正確的控制器,視圖分辨率也會在根文件夾中查找視圖。

爲了測試,我用下面的入戶指標的行動我區家居控制器:

public ActionResult Index() 
{ 
    return View(model: "Admin area home controller"); 
} 

然後我在/瀏覽次數index.chstml /主頁:

Root View: @Model 

和我index.cshtml在/地區/管理/瀏覽/首頁:

Admin Area view: @Model 

運行時,輸出爲:

根查看:管理區家居控制器

所以路線使得在管理方面來看家用控制器,但隨後thew視圖分辨率的推移,發現根視圖,而不是管理視圖。

所以最終確實是視圖選擇是錯誤的,所以你的問題和How to set a Default Route (To an Area) in MVC一樣。

+0

我看,好吧謝謝你看這 – spooti

37

最簡單的方法是將數據令牌添加到您的默認路由:

routes.MapRoute(
    "Default", 
    "{controller}/{action}/{id}", 
    new {controller = "Home", action = "Index", id = UrlParameter.Optional } 
).DataTokens.Add("area", "Admin"); 

只需添加

.DataTokens.Add("area", "[your area name]"); 

到您的默認路由定義的結尾。

+0

這對我工作假設我沒有重複控制器,例如不允許有兩個'HomeController' – wal

+7

如果你有重複的控制器只是添加一個名稱空間屬性。 ''namespaces:new [] {「Solution.MyProject.Areas.Admin.Controllers」}'' –

+0

加1,它工作thx .. –

6

此解決方案將破壞您的API路線。 你必須有一些獨特的名稱爲每個區域,像默認的區域使得:

context.MapRoute(
     "Common_default", 
     "**Common**/{controller}/{action}/{id}", 
     new { action = "Index", id = UrlParameter.Optional } 
); 

正確的解決辦法,以低於默認的路徑:

網絡區域航線:

context.MapRoute(
     "Common_default", 
     "Common/{culture}/{controller}/{action}/{id}", 
     new {culture = CultureHelper.GetDefaultCulture(), controller = "Home", action = "Index", id = UrlParameter.Optional } 
); 

主要途徑將用戶重定向到「Common」區域:

routes.MapRoute(
      name: "Default", 
      url: "{culture}/{controller}/{action}/{id}", 
      defaults: new { culture = CultureHelper.GetDefaultCulture(), controller = "Home", action = "Index", id = UrlParameter.Optional }, 
      namespaces: new[] { "SMS.Sender.Areas.Common.Controllers" } 
     ).DataTokens.Add("area","Common"); 
0

最簡單的方法t從區○路線從AreaRegistration頁:

context.MapRoute("MainDefault", "Main/{controller}/{action}/{id}", new { action = "Index", id = UrlParameter.Optional } , new[] { "Namespace.To.Controllers" }); 

context.MapRoute("ClearPath", "", new { controller = "Home", action = "Index" }, new[] { "Namespace.To.Controllers" }); 
1

添加Index操作方法在默認的根主控制器。在Index操作方法使用 「返回redirecttoaction」 語句默認區域重定向

public ActionResult Index() 
    { 
     return RedirectToAction("Dashboard", "Home", new {area = "Home"}); 
    } 

默認路由應該是

routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new {controller = "Home", 
action = "Index", id = UrlParameter.Optional} 
       ); 
0

在你

RouteConfig.cs

routes.MapRoute("redirect all other requests", "{*url}", 
     new { 
      controller = "UnderConstruction", 
      action = "Index" 
      }).DataTokens = new RouteValueDictionary(new { area = "Shop" }); 
1

試試這樣做......這將有助於區分。即使你不添加area =「Web」,它的fi NE

routes.MapRoute(
    "Default", // Route name 
    "{controller}/{action}/{id}", // URL with parameters 
    new { controller = "Home", action = "Index", area="Web", id = UrlParameter.Optional }, 
    new[] { "Nop.Web.Controllers" } 
).DataTokens["UseNamespaceFallback"] = false; 

原路

context.MapRoute(
    "Admin_default", 
    "Admin/{controller}/{action}/{id}", 
    new { controller = "Home", action = "Index", area = "Admin", id = "" }, 
    new[] { "Nop.Admin.Controllers" } 
); 
+0

確認'area =「Web」'不是必需的。 RouteCollectionExtensions中的MapRoute()重載在內部執行'route.DataTokens [RouteDataTokenKeys.Namespaces] = namespaces;'在我看來,這是一種更符合框架的方法。鏈接到有問題的源代碼:https://github.com/ASP-NET-MVC/aspnetwebstack/blob/master/src/System.Web.Mvc/RouteCollectionExtensions.cs#L189 – Manfred

0

默認路由是由MVC默認路由將首先調用,因爲在MVC中指定哪條路線的第一個會叫這樣的