Вопрос разрешения маршрута MVC 3 - PullRequest
0 голосов
/ 14 июля 2011

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

  • студент / возможно / классы / {идентификатор}
  • студент / доступные / классы / {studentId} / {classTypeId}
  • студент / возможно / классов / запросов / {д}

Так я регистрирую маршруты в моем файле global.asax.cs

//Student Checkin
routes.MapRoute("StudentAvailableClasses_GetAllForStudent",
            "student/available/classes/{id}",
            new {controller = "StudentCheckin", action = "GetById"});
routes.MapRoute("StudentAvailableClasses_GetClassForStudent",
            "student/available/classes/{studentId}/{classTypeId}",
            new { controller = "StudentCheckin", action = "GetByStudentAndClassType" });
routes.MapRoute("StudentAvailableClasses_Query",
            "student/available/classes/query/{q}",
            new { controller = "StudentCheckin", action = "Query" });

Когда я выполняю этот URL

студент / доступные / классы / запросы / кузнец + джон

MVC пытается запустить этот маршрут:

студент / доступные / классы / {studentId} / {classTypeId}

Если я изменим порядок, в котором я регистрирую маршрут Query с помощью маршрута GetClassForStudent, MVC преобразуется в маршрут запроса.

Что здесь происходит, и как я могу зарегистрировать эти маршруты в MVC, чтобы они все разрешались правильно?

UPDATE

Ого, еще раз спасибо всем здесь, на stackoverflow! Основываясь на ответах всех, и в частности на ответе Бено, я теперь понимаю свою проблему и смог заставить ее работать!

Насколько я понимаю, я не давал MVC достаточно информации о маршрутах. Это соответствовало слову 'query' в параметре {studentId}. Из ответа Бено я узнал об ограничениях параметров. Поэтому теперь я могу сказать MVC ожидать тип Guid в параметре {studentId} (и {customerId}).

Вот код сейчас.

    //Student Checkin
    routes.MapRoute("StudentAvailableClasses_GetAllForStudent",
                    "student/available/classes/{id}",
                    new {controller = "StudentCheckin", action = "GetById"},
                    new {id = new GuidConstraint()});
    routes.MapRoute("StudentAvailableClasses_GetClassForStudent",
                    "student/available/classes/{studentId}/{classTypeId}",
                    new {controller = "StudentCheckin", action = "GetByStudentAndClassType"},
                    new {studentId = new GuidConstraint(), classTypeId = new GuidConstraint()});
    routes.MapRoute("StudentAvailableClasses_Query",
                    "student/available/classes/query/{q}",
                    new { controller = "StudentCheckin", action = "Query" });

Класс GuidConstraint Я нашел из этого вопроса stackoverflow .

Спасибо!

Ответы [ 3 ]

2 голосов
/ 14 июля 2011

Я бы настоятельно рекомендовал запускать ваши маршруты через Routing Debugger .Он покажет вам точно, где ваши зависания.

Route Tester

1 голос
/ 14 июля 2011

Что здесь происходит?

URL, student/available/classes/query/smith+john правильно подобран по маршруту student/available/classes/{studentId}/{classTypeId}, поскольку {studentID} может быть любым, включая «запрос». «Смит + Джон» затем выбирается как {classTypeId}

как я могу зарегистрировать эти маршруты в MVC, чтобы они все разрешались правильно?

Вы можете добавить некоторую проверку в поле {studentId}. Я не знаю, какой у вас идентификатор студента, но если это 8-значный номер:

routes.MapRoute("StudentAvailableClasses_GetClassForStudent",
       "student/available/classes/{studentId}/{classTypeId}",
       new { controller = "StudentCheckin", action = "GetByStudentAndClassType" }
       new { studentId = @"\d{8}" } );

OR

Вы можете разместить маршрут StudentAvailableClasses_Query наверху, чтобы он соответствовал перед другим

OR

комбинация обоих, что, вероятно, лучшая ставка

0 голосов
/ 14 июля 2011

Маршруты разрешаются в порядке их регистрации. Всегда регистрируйте более конкретные маршруты перед более общими маршрутами.

Чтобы решить вашу проблему, переместите маршрут «StudentAvailableClasses_Query», чтобы он был отображен первым.

counsellorben

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