帮助MVC 3路由

本文关键字:3路 MVC 帮助 | 更新日期: 2023-09-27 18:05:19

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

我的URL结构相当简单,但是包含了一些变量。

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

例子:

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

我在全局文件中创建了以下路由。asax文件。

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

在/server/details/id处显示服务器列表和服务器详细信息可以正常工作,但是当我尝试执行重新启动时,我得到了一个错误。

的URL: http://site.com/ny/prod/server/reboot/565656

没有找到视图'ny'或它的主视图或没有视图引擎支持搜索地点。

为什么它会尝试寻找一个视图名称ny.cshtml?

帮助MVC 3路由

我认为你的问题是你要么没有使用约束来定义位置和舞台应该是什么样子,它会给你误报,并在不应该的地方读取东西,或者你的路由定义顺序错误

确保你有默认的MVC定义最后,如果你有多个自定义路由约束要么使用正则表达式或自定义约束类来定义什么位置是有效的,他们应该看起来像

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

  • 不是一个有效的位置-创建一个自定义约束来定义什么有效位置是根据数据库或有效列表对其进行验证位置

  • 是测试一个有效的阶段- regex可能是足够的,但我总是尽量避免使用regex,因为它是邪恶的,难以维护。同样,我将编写一个自定义约束来定义哪些阶段是有效的,可能针对列表进行验证就足够了,因为您不应该有很多阶段同样需要注意的是,在url中使用阶段时,你还可以在约束中添加身份验证规则,例如,只有…管理员或利益相关者角色被映射到路由上,普通或未经过身份验证的用户将直接跳转到下一个路由,或者可以简单地给出404

写入路径可能会很棘手,因此建议尽可能地控制输入数据,特别是当您接受字符串数据

时。

stephen walther在他的博客上有一篇关于写路由约束的好文章