帮助MVC 3路由

时间:2011-08-12 17:24:19

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

我的MVC 3应用程序中有一个简单的路由结构,它以一种意想不到的方式破解。

我的网址结构相当简单,但包含一些变量。

http://site.com/ {位置} / {阶段} / {控制器} / {行动} / {ID}

的示例:

  • http://site.com/ny/prod/server/list - 列出ny中的所有prod服务器
  • http://site.com/ny/test/server/123456 - 在测试阶段列出ny中服务器的详细信息,ID为123456
  • http://site.com/ny/prod/server/reboot/565656 - 使用id 565656
  • 在pry阶段重新启动ny服务器

我在Global.asax文件中创建了以下路由。

routes.MapRoute("Default", "{location}/{stage}/{controller}/{action}/{id}", new {controller="server", action="list", id = UrlParameter.Optional});

这适用于在/ server / details / id显示服务器列表和服务器详细信息,但是当我尝试执行重新启动时,我收到错误。

网址:http://site.com/ny/prod/server/reboot/565656

  

未找到视图'ny'或其主控或没有视图引擎支持   搜索到的位置。搜索了以下位置:...

为什么要尝试查找视图名称ny.cshtml?

1 个答案:

答案 0 :(得分:0)

我认为你的问题是你要么没有使用约束来定义哪个位置和阶段应该是什么样的,它会给你误报并在不应该的位置读东西,或者你有你的路线定义订单错误

确保你有最后定义的默认mvc,如果你有多个自定义路由约束使用正则表达式或自定义约束类来定义哪些位置有效且它们看起来应该是

例如http://site.com/ny/test/server/123456

  • 是一个有效的位置 - 制作一个定义了什么的自定义约束 有效位置是针对数据库或有效列表进行验证 位置

  • 正在测试一个有效的阶段 - 正则表达式可能就足够但我总是尽量避免使用正则表达式,因为它是邪恶的并且难以维护。再次,我会编写一个自定义约束来定义哪些阶段有效可能验证列表就足够了,因为你不应该有很多阶段 还要注意使用阶段你在你的网址中的方式,你也可以在约束中添加身份验证规则,以便只有那些..say ..管理员或利益相关者角色的人可以匹配路由和常规或非身份验证用户只需进入下一条路线,或者只需提供404

  • 即可

编写路线可能很棘手,因此建议尽可能多地限制输入数据,尤其是在接受字符串数据的情况下

斯蒂芬沃尔特在他的blog

上写了一篇关于写路线约束的文章