Принудительный маршрут mvc для контроллера

У меня есть следующие два маршрута, определенные в моих приложениях.

      routes.MapRoute(
             "ApplicationRoutes",
             "{language}-{country}/{userid}/{controller}/{action}/{id}",
            new { language="en" , country="gb",  id = UrlParameter.Optional }
        );


        routes.MapRoute(
             "Default",
             "{language}-{country}/{controller}/{action}/{id}",
            new { language = "en", country = "gb",  id = UrlParameter.Optional }
        );

Первый маршрут будет перехватывать такие URL-адреса, как

  • en-gb/11111/Цели/Список
  • en-gb/11111/Цели/Редактировать/2

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

  • en-gn/Учетная запись/Вход
  • так далее

У меня есть вопрос: у меня есть определенные контроллеры, которые я хочу заставить вызываться только в том случае, если они пришли через маршрут applicationRoutes.

например, я хочу убедиться, что контроллер целей вызывается с идентификатором пользователя в данных маршрута.

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

Я также мог бы уточнить маршруты и сделать что-то вроде этого:

  routes.MapRoute(
             "ApplicationRoutes",
             "{language}-{country}/{userid}/Targets/{action}/{id}",
            new { language="en" , country="gb", controller="targets", id = UrlParameter.Optional }
        ); 

Но это не остановит запрос непосредственно к en-gb/Targets/List/ без указания значения идентификатора пользователя.

как лучше всего справиться с этим?


person Kramer00    schedule 02.12.2012    source источник


Ответы (1)


Вы можете создать ограничение для параметра userid.

  routes.MapRoute(
             "ApplicationRoutes",
             "{language}-{country}/{userid}/{controller}/{action}/{id}",
              new { language="en" , country="gb",  id = UrlParameter.Optional },
              new { userid =@"\d+" }); 

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

person Ufuk Hacıoğulları    schedule 02.12.2012
comment
Здорово. Это было бы идеально, если бы был один контроллер, которому это нужно, но допустим, что у меня есть множество контроллеров, которым нужен идентификатор пользователя. Я мог бы реализовать определенный маршрут для каждого контроллера, как вы указали, но есть ли более элегантное решение для создания маршрута для каждого контроллера? - person Kramer00; 03.12.2012
comment
Извините, я забыл ограничение контроллера. Вы можете оставить переменную контроллера как есть. - person Ufuk Hacıoğulları; 03.12.2012
comment
даже с ограничением, конечно, это не помешает мне перейти к /en-gb/Targets/List без идентификатора пользователя в маршруте, потому что маршрут по умолчанию справится с этим. Я хотел бы убедиться, что каждое действие, вызванное на целевом контроллере, содержит идентификатор пользователя в данных маршрута. - person Kramer00; 03.12.2012
comment
Что ж, если вы будете осторожны при создании URL-адресов, это не будет проблемой. В противном случае вы не сможете помешать людям возиться с ним, всегда будут недействительные URL-адреса. Там могут быть какие-то сложные правила, которые могут вам понадобиться, может быть, кто-то еще может помочь. - person Ufuk Hacıoğulları; 03.12.2012