MVC3 Area + Authorize attribute + Роль странной проблемы - PullRequest
1 голос
/ 06 декабря 2011

Я действительно не знаю, какое название мне следует использовать, чтобы описать мою проблему.Чтобы упростить мою проблему.Вот мой тест.Я создаю сайт mvc3 с нуля.Затем я добавляю область под названием «админ».Внутри администратора у меня есть контроллер с именем «Поиск» и украшенный атрибут «Авторизация».Затем я изменил настройки маршрута Global.ascx.cs, чтобы добавить пространство имен моего контроллера.Теперь я начинаю свой тест.

Вопрос 1

Когда я открываю страницу http://localhost:xxx/Search, он перенаправляет меня обратно на страницу / Учетная запись / Вход в систему,сначала меня смущает, почему перенаправляет меня на страницу входа?как я понимаю, он не должен доходить до контроллера поиска администратораЕсли я удалил атрибут Authorize, он отобразит желтый экран, который говорит, что не может найти вид, как я ожидал.

Вопрос 2

Если я добавлю атрибут Authorize с рольюНапример, (Roles = "Admin"), затем я снова пытаюсь получить доступ к странице поиска, независимо от того, успешно ли выполнен вход или нет, я всегда получаю перенаправление на страницу входа.Почему это не дает мне желтый экран, потому что я пытаюсь запросить индексное представление контроллера поиска на главном сайте, а не в административной области.очень запутанно.

Я новичок в разработке MVC, может кто-нибудь дать мне решение относительно моей проблемы?

Спасибо

Global.ascx.cs

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

        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional },                      
            new string[]{"TestAreaRouting.Controllers"}
          );

        }

1 Ответ

1 голос
/ 06 декабря 2011

Можно ограничить фабрику контроллеров по умолчанию, чтобы искать только внутри указанного пространства имен для контроллеров в методе RegisterRoutes Global.asax, установив для маркера данных UseNamespaceFallback значение false:

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

Если вы не сделаете этого при запросе /search, маршрут области admin не будет совпадать, поскольку URL-адрес не начинается с префикса Admin.

Так что это маршрут по умолчанию, который соответствует. Фабрика контроллеров по умолчанию начинает сканирование сборки на предмет класса с именем SearchController, производного от Controller, и, поскольку он находит его, он создает его экземпляр и использует его для обслуживания запроса. Очевидно, он не находит соответствующего представления индекса, потому что он выглядит в ~/Views/Search/Index.cshtml, который, очевидно, не существует. Фактический вид находится в районе.

Теперь, когда мы ограничили контроллеры их соответствующими местоположениями, вы можете украсить их атрибутом Authorize, и он должен вести себя согласованно.

...