Ven*_*emo 6 .net asp.net asp.net-mvc routing asp.net-routing
我希望通过一些增强功能实现与此问题非常相似的功能.
有一个ASP.NET MVC Web应用程序.
我有一个实体树.
例如,一个Page具有名为Children的属性的类,它是类型的IList<Page>.(Page类的实例对应于数据库中的行.)
请注意,网站所有者可以随时添加新页面,也可以删除现有页面,并且URL也应反映这些更改.
我想Page为数据库中的每个人分配一个唯一的URL .
我Page使用Controller调用对象PageController.
示例网址:
http://mysite.com/Page1/
http://mysite.com/Page1/SubPage/
http://mysite.com/Page/ChildPage/GrandChildPage/
Run Code Online (Sandbox Code Playgroud)
你得到了照片.
所以,我希望每个Page对象都有自己的URL,该URL等于其父URL和自己的名称.
除此之外,我还希望能够将单个映射Page到/(根)URL.
我想应用这些规则:
PageController该类我也发现了这个问题,并且也这一个和这一个,但他们有很大帮助没有,因为它们不提供有关我的头两个点的说明.
我看到以下可能的消息:
{*path}并编写一个IRouteHandler处理它的自定义,但我看不出我怎么能处理前两个规则,因为这个处理程序将处理所有事情.到目前为止,第一个解决方案似乎是正确的解决方案,因为它也是最简单的解决方案.但是,即使在那种情况下,我也不确定如何PageController处理请求.
我真的很感激你对此的看法.
先感谢您!
编辑:我现在有时间检查我收到的每个答案的每个方面.我接受了尼尔的回答,因为他是一个提供关于事情如何运作的最佳解释的人.我还提出了所有其他答案,因为它们提供了很好的想法.
路由按照添加到集合中的顺序进行处理。您可以在现有路由之后添加自定义路由,以确保它是最后一个有机会处理请求的路由。这将允许您在其之前添加现有文件(虚拟或其他)的路由,从而满足条件 1 和 2。
默认情况下,MVC 路由会在应用路由集合中存储的任何路由之前路由到现有文件;请参阅http://msdn.microsoft.com/en-us/library/system.web.routing.routecollection.routeexistingfiles.aspx。(给保罗的帽子 - 见评论)。
要将请求路由到页面控制器,只需创建一个自定义路由来检查虚拟路径,如果它与数据库中页面的模式匹配,则返回RouteData. 使用从虚拟路径中提取的适当值进行设置RouteData(例如,将 Path 键设置为 /Parent/Child/Grandchild),将控制器键设置为页面控制器名称(例如 Page),将操作设置为要执行的操作的名称。你想要执行(例如显示)。RouteData应该使用MvcRouteHandler( 不确定这是否是正确的类名)创建。
为了确保正确返回数据库驱动页面的 URL,请重写 的GetVirtualPath( RequestContext, RouteValueDictionary )方法RouteBase并使用传入的路由值来确定这是否是数据库驱动页面以及是否创建所需的虚拟路径数据(否则返回 null)。
GetRouteData如需重写and的帮助,请查看andGetVirtualPath的反映源代码;之后谷歌就是你的朋友。System.Web.Routing.RouteBaseSystem.Web.Routing.Route
路由反向用于确定给定控制器、操作和任何其他路由值的 url。您应该能够利用它在请求的上下文中构建页面的 URL。
| 归档时间: |
|
| 查看次数: |
1404 次 |
| 最近记录: |