У меня есть следующие 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 .
Спасибо!