Маршрутизация области MVC?

Папки областей выглядят так:

Areas 
    Admin
        Controllers
            UserController
            BranchController
            AdminHomeController

Каталоги проекта выглядят так:

Controller
    UserController
        GetAllUsers

регистрация маршрута области

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

регистрация маршрута проекта

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
        namespaces: new string[] { "MyApp.Areas.Admin.Controllers" });
}

Когда я маршрутизирую следующим образом: http://mydomain.com/User/GetAllUsers я получаю ошибку "ресурс не найден" (404). Я получаю эту ошибку после добавления UserController в Area.

Как я могу исправить эту ошибку?

Спасибо...


person AliRıza Adıyahşi    schedule 25.03.2013    source источник


Ответы (2)


Вы перепутали пространства имен вашего контроллера.

Ваше основное определение маршрута должно быть:

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
    namespaces: new string[] { "MyApp.Controllers" }
);

И ваша регистрация маршрута в области администратора должна быть:

public override void RegisterArea(AreaRegistrationContext context)
{
    context.MapRoute(
        "Admin_default",
        "Admin/{controller}/{action}/{id}",
        new { action = "Index", id = UrlParameter.Optional },
        new { controller = "Branch|AdminHome|User" },
        new[] { "MyApp.Areas.Admin.Controllers" }
    );
}

Обратите внимание, как следует использовать правильные пространства имен.

person Darin Dimitrov    schedule 25.03.2013
comment
Меня смутили пространства имен, соответствующие областям. В этом примере пространство имен MyApp.Areas.Admin.Controllers соответствует иерархии папок, однако определение пространства имен является произвольным, верно? Это означает, что программист может назначить любое пространство имен классу контроллера, которое он хочет, - подумал я. Или есть какое-то соглашение asp.net mvc, которое требует, чтобы пространство имен соответствовало иерархии папок? - person Howiecamp; 25.08.2014
comment
@Howiecamp поведение Visual Studio по умолчанию заключается в сопоставлении пространства имен с иерархией папок, и это то, что вы обычно видите во всех проектах .net (а не только в проектах MVC). - person Caleb Vear; 26.11.2014

Актуальное решение для ASP.NET Core MVC.

[Area("Products")]
public class HomeController : Controller

Источник: https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/areas

person Mark    schedule 11.03.2018