asp.net-mvc – ASP.net MVC自定义路由处理程序/约束

前端之家收集整理的这篇文章主要介绍了asp.net-mvc – ASP.net MVC自定义路由处理程序/约束前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我需要使用下面的url实现一个MVC网站:

> category1 / product / 1 / wiki
> category1 / product / 2 / wiki
> category1 / sub-category2 / product / 3 / wiki
> category1 / sub-category2 / sub-category3 / product / 4 / wiki
>等等

匹配标准是url以“wiki”结尾.

不幸的是,下面的catch-all仅在URL的最后一部分工作:

  1. routes.MapRoute("page1",// Route name
  2. "{*path}/wiki",// URL with parameters
  3. new { controller = "Wiki",action = "page",version = "" } // Parameter defaults

我没有时间通过​​MVC可扩展性选项,所以我想知道实现这个可能的选择是什么?任何样品/样品将是太棒了!

解决方法

如上所述,catch-all参数只能出现在路由的末尾 – 如果您尝试运行应用程序,则您发布的代码会导致运行时错误,并给您黄色的死亡屏幕.

构建自定义路由场景有几个可扩展点.这些是 – Route,RouteBase和IRouteHandler.

您可以通过扩展RouteBase来创建要处理的生成的路由列表.通常,您将遵循拥有一个构造函数的模式,该构造函数接收一个资源(控制器名称),然后分配一个它负责的路由列表,然后将其映射到global.asax中.以下是一些您可以从中构建的示例代码

  1. public class MyRoute : RouteBase
  2. {
  3. private List<Route> _routes = new List<Route>();
  4.  
  5. public MyRoute(string resource)
  6. {
  7. // make a Resource property,not shown in this example
  8. this.Resource = resource;
  9.  
  10. // Generate all your routes here
  11. _routes.Add(
  12. new Route("some/url/{param1}",new McvRouteHandler {
  13. Defaults = new RouteValueDictionary(new {
  14. controller = resource,action = actionName
  15. }),Constraints = new RouteValueDictionary()
  16. );
  17. _routes.Add(...); // another new route
  18. }
  19.  
  20. public override RouteData GetRouteData(HttpContextBase context)
  21. {
  22. foreach (var route in _routes)
  23. {
  24. var data = route.GetRouteData(context);
  25. if (data != null)
  26. {
  27. return data;
  28. }
  29. }
  30. return null;
  31. }
  32.  
  33. public override VirtualPathData GetVirtualPath(RequestContext context,RouteValueDictionary rvd)
  34. {
  35. foreach (var route in _routes)
  36. {
  37. var path = route.GetVirtualPath(context,rvd);
  38. if (path != null)
  39. {
  40. return path;
  41. }
  42. }
  43. return null;
  44. }
  45. }

要使用您的路由类,请执行routes.Add(new MyRoute(“page1”));在你的Global.asax.

如果需要更多的控制,可以实现一个IRouteHandler,而不是为您的路由创建MvcRouteHandlers(),如上例所示,请使用您自己的IRouteHandler.这将允许您覆盖从请求数据中选择控制器的逻辑.

整个框架是非常可扩展的,但您需要学习相当多的一些才能正确执行.我建议您尽可能地重新排列您的URL,以便您可以利用catch-all参数.

猜你在找的asp.Net相关文章