Как регистрировать маршруты типа Admin / {controller} / {action} / {id} - PullRequest
2 голосов
/ 28 декабря 2011

Я автоматически регистрирую маршруты для модулей и пытаюсь зарегистрировать маршруты для администратора. Для регистрации модулей работает нормально

public class ModulSetup : BaseModule
{
    public override void Setup()
    {
        this.SetupViewEngine();
        this.SetupControllers();
    }

    public override void SetupRoutes(RouteCollection routes)
    {
        routes.MapRoute(
            "Default",
            string.Empty,
            new { controller = "Home", action = "Index" });
    }

    protected override void SetupViewEngine()
    {
        ViewEngines.Engines.Add(new CoreViewEngine());
    }

    protected override void SetupControllers()
    {
        ControllerBuilder.Current.DefaultNamespaces.Add("SGN.Core.Controllers");
    }
}

Но за админа я получаю 404

public class AdminSetup : BaseModule
{
    public override void Setup()
    {
        this.SetupViewEngine();
        this.SetupControllers();
    }

    public override void SetupRoutes(RouteCollection routes)
    {
        routes.MapRoute(
            "Admin",
            "Admin/{controller}/{action}/{id}",
            new { controller = "Site", action = "Index" });

    protected override void SetupViewEngine()
    {
        ViewEngines.Engines.Add(new AdminViewEngine());
    }

    protected override void SetupControllers()
    {
        ControllerBuilder.Current.DefaultNamespaces.Add("SGN.Core.Admin.Controllers");
    }
}

Пример. У меня есть контроллеры класса Site

namespace SGN.Core.Admin.Controllers
{
using System.Web.Mvc;
using SGN.Framework.Controller;

public class SiteController : AdminController
{
    public ActionResult Index()
    {
        return this.View();
    }
}
}

А когда я пытаюсь перейти на http://localhost:777/Admin/Site/, сервер возвращает 404: (

UPDATE

Я пытаюсь создать AreaAwareViewEngine, пишу тебе Как установить маршрут по умолчанию (в область) в MVC

но не поможет

UPDATE

Я пытаюсь использовать этот URL http://localhost:777/Admin/Site/Index работа. Но это не хорошо. И Мастер не работает.

UPDATE

Я использую RouteDebugger для проверки в другом проекте, где я использую Area. Что добавить при использовании Area. Как я понимаю в DataTokens Add 3 параметра

Пространства имен = SGN.Web.Areas.Admin. , area = Admin, UseNamespaceFallback = False *

Я пытаюсь добавить эти параметры

Пространства имен = SGN.Core.Admin. , area = Admin, UseNamespaceFallback = False *

но не поможет

UPDATE

Я создал класс AreaAwareViewEngine, как написать здесь Как установить маршрут по умолчанию (в область) в MVC

Мой класс AreaRegistration

namespace SGN.Web.Admin
  {
using System.Web.Mvc;

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 {area="Admin", controller = "Site", action = "Index", id = UrlParameter.Optional }
        );
    }
}
}

И создать AdminViewEngine из AreaAwareViewEngine

namespace SGN.Core.Admin
{
using System.Web.Mvc;

using SGN.Framework;

public class AdminViewEngine : AreaAwareViewEngine
{
    public AdminViewEngine()
    {
        AreaMasterLocationFormats = new[] { "~/Admin/Views/Shared/admin.cshtml" };

        AreaPartialViewLocationFormats = new[] { "~/Admin/Views/{1}/Partials/{0}.cshtml", "~/Admin/Menu/{0}.cshtml" };

        AreaViewLocationFormats = new[] { "~/Admin/Views/{1}/{0}.cshtml", "~/Admin/Menu/{0}.cshtml" };

        ViewLocationFormats = AreaViewLocationFormats;
        PartialViewLocationFormats = AreaPartialViewLocationFormats;
        MasterLocationFormats = AreaMasterLocationFormats;
    }

    protected override IView CreatePartialView(ControllerContext controllerContext, string partialPath)
    {
        return new RazorView(controllerContext, partialPath, null, false, FileExtensions);
    }

    protected override IView CreateView(ControllerContext controllerContext, string viewPath, string masterPath)
    {
        if (string.IsNullOrEmpty(masterPath))
        {
            masterPath = AreaMasterLocationFormats[0];
        }
        var view = new RazorView(controllerContext, viewPath, masterPath, true, FileExtensions);
        return view;
    }
}
  }

Работать, если я иду на http://localhost:777/Admin/Site/ и не работать, если я иду на http://localhost:777/Admin

Ответы [ 2 ]

0 голосов
/ 28 декабря 2011

Прежде всего, убедитесь, что ваш маршрут «Администратор» сопоставлен с маршрутом по умолчанию, не относящимся к Администратору.Кроме того, я бы изменил ваш маршрут администратора следующим образом:

routes.MapRoute(
        "Admin",
        "Admin/{controller}/{action}/{id}",
        new { controller = "Site", action = "Index", id = UrlParameter.Optional });

Таким образом, параметр маршрута id по умолчанию имеет значение UrlParameter.Optional.Ваш первоначальный маршрут не имел значения по умолчанию для id, поэтому он будет требовать его.

0 голосов
/ 28 декабря 2011

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

от Haack.

Кроме того, есть ли причина, по которой вы не используете функцию встроенных областей? Это выглядит как идеальный вариант для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...