MVC 3路径解析问题

时间:2011-07-14 04:01:12

标签: asp.net asp.net-mvc-3 c#-4.0 routes

我有以下3条路线

  • 学生/可用/类/ {ID}
  • 学生/可用/类/ {studentId} / {classTypeId}
  • 学生/可用/类/查询/ {Q}

这是我在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

谢谢!

3 个答案:

答案 0 :(得分:2)

我强烈建议您通过Routing Debugger运行路线。它会准确显示您的挂起位置。

Route Tester

答案 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