Общий ASP.NET MVC Route Conflict - PullRequest
       34

Общий ASP.NET MVC Route Conflict

3 голосов
/ 29 декабря 2010

Я работаю в устаревшей системе ASP.NET.Я говорю «наследие», потому что нет НИКАКИХ тестов около 90% системы.Я пытаюсь исправить маршруты в этом проекте и сталкиваюсь с проблемой, которую хочу решить с помощью общих маршрутов.

У меня есть следующие маршруты:

        routes.MapRoute(
             "DefaultWithPdn",
             "{controller}/{action}/{pdn}",
             new { controller = "", action = "Index", pdn = "" },
             null
         );

        routes.MapRoute(
           "DefaultWithClientId",
           "{controller}/{action}/{clientId}",
           new { controller = "", action = "index", clientid = "" },
           null
       );

Проблема в том, что первый маршрут перехватывает весь трафик для того, что мне нужно направить на второй маршрут.Маршрут является общим (контроллер не определен в ограничении в любом из определений маршрута), поскольку несколько контроллеров во всем приложении используют одну и ту же предпосылку (иногда нам нужен «pdn», иногда нам нужен «clientId»).

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

Моя единственная опция на данный момент (AFAIK) - одна из следующих:

В ограничениях примените регулярное выражение для соответствия значениям действия, таким как: (foo | bar | biz | bang)и то же самое для контроллера: (home | customer | products) для каждого контроллера.Однако проблема заключается в том, что мне, возможно, потребуется сделать следующее:

~ / Foo / Home / 123 // Должен отображаться в «DefaultwithPdn»

~ / Foo / Home /abc // Должен отображаться на «DefaultWithClientId»

Это означает, что если у контроллера Foo есть действие, которое принимает pdn, и другое действие, которое принимает clientId (что происходит в этом приложении все время), неправильный маршрут

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

Могу ли я иметь общие маршруты для обработки этого сценария?Или мне нужно иметь собственные маршруты для каждого контроллера с ограничениями, применяемыми к действиям на этих маршрутах?

Спасибо

Ответы [ 2 ]

3 голосов
/ 29 декабря 2010

Добавьте ограничения к вашим маршрутам, удалив null и заменив его на ограничение, необходимое для этого маршрута:

Для PDN используйте регулярное выражение для цифр:

   routes.MapRoute(
         "DefaultWithPdn",
         "{controller}/{action}/{pdn}",
         new { controller = "", action = "Index", pdn = "" },
         new { pdn = @"\d+" } 
     );

Для ClientID используйте регулярное выражение для всех символов:

    routes.MapRoute(
       "DefaultWithClientId",
       "{controller}/{action}/{clientid}",
       new { controller = "", action = "index", clientid = "" },
       new { clientid = @"[A-Za-z]+" }
   );

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

1 голос
/ 29 декабря 2010

Вы должны добавить некоторые ограничения маршрута, которые говорят, что маршрут PDN соответствует номерам, а ClientId соответствует строкам

Обычно я создаю серию совпадений для использования в моем объявлении маршрута следующим образом:

readonly static string ALPHA_MATCH = @"[\da-zA-Z]";
readonly static string DIGIT_MATCH = @"\d+";

, затем добавьте ограничения к маршрутам следующим образом:

routes.MapRoute(
    "DefaultWithPdn",
    "{controller}/{action}/{pdn}",
    new { controller = "", action = "Index", pdn = "" },
    new { pdn = DIGIT_MATCH }
);

routes.MapRoute(
    "DefaultWithClientId",
    "{controller}/{action}/{clientId}",
    new { controller = "", action = "index", clientid = "" },
    new { clientId = ALPHA_MATCH }
);
...