Как я могу создать 1 маршрут с доступом двух разных пользователей в ASP.NET MVC? - PullRequest
1 голос
/ 01 марта 2009

Как я могу это сделать: у меня есть страница с именем «Расписание», доступ к которой можно получить двумя различными способами:

URL 1- www.bla.com/Admin/Schedule
URL 2- www.bla.com/Schedule

«URL 1» будет доступен пользователям с привилегиями администратора, и в этом представлении будут отображаться некоторые элементы администратора, и пользователи должны быть зарегистрированы в системе.

С другой стороны, «URL 2» будет доступен пользователям NOT LoggedOn и НЕ будет отображать админский материал.

Но это одна и та же страница, только с некоторыми различиями в зависимости от доступа пользователя.

У меня уже есть AdminController, и я намереваюсь поместить это представление «Расписание» как часть этого контроллера. В результате я знаю, что если я введу «URL 1», он будет работать. Но если я наберу "URL 2"? Должен ли я создать «ScheduleController» только для того, чтобы справиться с этим?

Интересно, есть ли способ решить эту проблему с помощью Global.asax, настроить маршрутизацию ... Я не знаю ...

Спасибо !!!

Ответы [ 3 ]

1 голос
/ 01 марта 2009

Сделайте View общим и просто визуализируйте его из обоих действий контроллера. Передайте соответствующие данные через модель (или ViewData), чтобы View знал, что не нужно визуализировать админский материал при рендеринге из действия контроллера без прав администратора.

И, да, создайте контроллер расписания. Сделайте маршрутизацию простой и сделайте общий код генерации на бэкэнде.

AdminController

public ActionResult Schedule( ... )
{
    Schedule sched = ... get model ...

    return View("Schedule", new SchedViewModel {
                                                 Schedule = sched,
                                                 Admin = true 
                                               } );
}

ScheduleController

public ActionResult Index( ... )
{
    Schedule sched = ... get model ...

    return View("Schedule", new SchedViewModel {
                                                 Schedule = sched,
                                                 Admin = false 
                                               } );    }
1 голос
/ 01 марта 2009

Вы можете сопоставить маршрут / Schedule с действием / Admin / Schedule из Global.asax.cs следующим образом:

        routes.MapRoute(
            "Schedule",
            "schedule",
            new { controller = "Admin", action = "Schedule" }
        );

Это решит вашу непосредственную проблему с желанием двух отдельных маршрутов, что приведет к одному и тому же действию / представлению.

Однако это не решит ваш сценарий должным образом. Основная проблема заключается в том, что идентификатор вошедшего в систему пользователя является ортогональным к маршруту, по которому идет запрос. Другими словами, вы не можете заставить пользователя с правами администратора всегда идти по маршруту / Admin / Schedule, они также могут попасть по маршруту / Schedule и все равно ожидают того же конечного результата. Мало того, но если вы сделаете это таким образом, вы не сможете использовать атрибут [Authorize] на контроллере администратора или действие, чтобы заставить пользователя войти в систему, и вам придется реализовать пользовательскую логику, проверяющую, по какому маршруту выполнено действие, и решить, Вы хотите принудительно войти в систему или пропустить пользователя.

Таким образом, вы должны принять решение:

  • вы предоставляете доступ к контроллеру, действию и представлению и определяете, отображать ли дополнительную информацию в представлении на основе идентификатора и роли участника вошедшего в систему пользователя (если есть). Тогда вам придется изменить имя контроллера, так как / Admin не будет отражать новую роль этого класса;
  • вы разделяете только представление и имеете два отдельных контроллера и действия - Admin.Schedule и User.Schedule. Вам нужно будет поместить представление в папку / views / shared и вернуть то же представление из обоих действий, потенциально передавая другую модель. В итоге вы получите два маршрута - / Admin / Schedule и / User / Schedule;
  • у вас есть два отдельных контроллера, действия и представления.

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

0 голосов
/ 01 марта 2009

Похоже, вам не нужен другой URL, если это та же страница. Однако, если по какой-то причине вы все еще хотите использовать 2 разных URL-адреса ...

URL 1:

routes.MapRoute("ScheduleAdmin", "Admin/Schedule",
                new
                {
                    controller = "AdminController",
                    action = "Schedule"
                });

URL 2:

routes.MapRoute("Schedule", "Schedule",
                new
                {
                    controller = "ScheduleController",
                    action = "Index"
                });

Вы не дали понять, какое действие вы использовали для контроллера расписания, поэтому смело меняйте его.

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