我有以下3条路线
这是我在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" });
当我执行此网址时
学生/可用/类/查询/史密斯+约翰
MVC尝试运行此路线:
学生/可用/类/ {studentId} / {classTypeId}
如果我颠倒了使用GetClassForStudent路由注册Query路由的顺序,MVC会解析为查询路由。
这里发生了什么,如何在MVC中注册这些路由,以便它们都能正确解析?
更新
哇,再次感谢stackoverflow上的所有人!基于每个人的回答,特别是Beno的回答,我现在理解了我的问题,并且能够让它发挥作用!据我所知,我没有给MVC足够的路线信息。它将'query'一词与{studentId}参数匹配。从Beno的回答中我了解了参数约束。所以现在我可以告诉MVC在{studentId}(和{customerId})参数中期望一个Guid类型。
现在是代码。
//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 I found from this stackoverflow question。
谢谢!
答案 0 :(得分:2)
我强烈建议您通过Routing Debugger运行路线。它会准确显示您的挂起位置。
答案 1 :(得分:1)
这里发生了什么?
路由student/available/classes/query/smith+john
正确选取了网址student/available/classes/{studentId}/{classTypeId}
,因为{studentID}
可以是任何内容,包括“查询”。然后'smith + john'被选为{classTypeId}
如何使用MVC注册这些路由以便它们都能正确解析?
您可以在{studentId}
字段中添加一些验证。我不知道你的studentId是什么,但如果它是一个8位数字:
routes.MapRoute("StudentAvailableClasses_GetClassForStudent",
"student/available/classes/{studentId}/{classTypeId}",
new { controller = "StudentCheckin", action = "GetByStudentAndClassType" }
new { studentId = @"\d{8}" } );
或强>
您可以将StudentAvailableClasses_Query
路线放在顶部,以便在另一个
或强>
这两者的组合可能是最好的选择
答案 2 :(得分:0)
路由按照注册顺序解析。始终在更一般的路线之前注册更具体的路线。
要解决您的问题,请将“StudentAvailableClasses_Query”路线移至第一个路线。
counsellorben