Маршрутизация - это поиск контроллера в моих областях, но не просмотр - PullRequest
5 голосов
/ 13 августа 2010

Я пытаюсь использовать класс Maarten Balliauw * Route Domain для сопоставления поддоменов с областями в приложении MVC2, чтобы у меня были URL-адреса, такие как:

http://admin.mydomain.com/home/index

вместо:

http://mydomain.com/admin/home/index

До сих пор у меня был только частичный успех.Выполнение направляется на правильный контроллер в правильной области, но затем он не может найти правильный вид.Я получаю следующую ошибку:

The view 'Index' or its master was not found. The following locations were searched:
~/Views/AdminHome/Index.aspx
~/Views/AdminHome/Index.ascx
~/Views/Shared/Index.aspx
~/Views/Shared/Index.ascx 

Это указывает на то, что MVC ищет представление только в корневой папке представлений, а не в папке представлений в области.Если я скопирую представление из папки представлений области в корневую папку представлений, страница отобразится нормально.Это, однако, полностью побеждает цель разделения APP на Области.

Я определяю маршрут для области как:

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

    public override void RegisterArea(AreaRegistrationContext context)
    {
        context.Routes.Add(
            "Admin_Default"
            , new DomainRoute(
                "admin.localhost"
                , "{controller}/{action}/{id}"
                , new { controller = "AdminHome", action = "Index", id = UrlParameter.Optional }
        ));
    }
}

Я не понимаю, почему он находитКонтролер внутри Района нормально, но не вид.

Ответы [ 2 ]

4 голосов
/ 14 августа 2010

ОК, я понял это. После загрузки исходного кода MVC 2 и добавления его к моему решению, как указано здесь , я прошел код MVC. Я обнаружил, что Маршруты внутри областей реализуют интерфейс IRouteWithArea. Этот интерфейс добавляет свойство 'Area' к RouteData, которое, что неудивительно, содержит имя области. Я изменил класс DomainRoute, чтобы реализовать этот интерфейс, и добавил пару перегруженных конструкторов, которые приняли этот дополнительный параметр, и теперь он работает именно так, как я хотел.

Код для регистрации моего маршрута теперь выглядит так:

 context.Routes.Add(
     "Admin_Default"
     , new DomainRoute(
         "admin.mydomain"
         ,"Admin"
         , "{controller}/{action}/{id}"
         , new { controller = "AdminHome", action = "Index", id = UrlParameter.Optional }
        ));
1 голос
/ 14 августа 2010

Если у вас есть общие имена контроллеров между вашими регионами и маршрутами по умолчанию, и похоже, что вы это делаете, вам может потребоваться определить пространства имен при вызове MapRoute.

Например, если пространство имен верхнего уровня вашего веб-приложения Web, метод RegisterRoutes в файле Global.asax.cs будет выглядеть примерно так:

routes.MapRoute(
    "Default",
    "{controller}/{action}/{id}",        
    new { action = "Index", id = UrlParameter.Optional },
    null,
    new string[] { "Web.Controllers" }
);

и тогда RegisterArea метод AdminAreaRegistration.cs будет выглядеть примерно так:

context.MapRoute(
    "Admin_Default",
    "Admin/{controller}/{action}/{id}",
    new { action = "Index", id = UrlParameter.Optional },
    null,
    new string[] { "Web.Areas.Admin.Controllers" }
);
...