gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 23:43:29 25 4
gpt4 key购买 nike

我需要实现一个带有以下网址的 MVC 站点:

  • category1/product/1/wiki
  • 类别1/产品/2/wiki
  • category1/sub-category2/product/3/wiki
  • category1/sub-category2/sub-category3/product/4/wiki
  • 等等

  • 其中匹配标准是 url 以“wiki”结尾。

    不幸的是,下面的包罗万象只适用于 url 的最后一部分:
    routes.MapRoute("page1", // Route name
    "{*path}/wiki", // URL with parameters
    new { controller = "Wiki", action = "page", version = "" } // Parameter defaults

    我还没有时间浏览 MVC 可扩展性选项,所以我想知道实现这一点的可能选择是什么?任何示例/示例都很棒!

    最佳答案

    正如您所提到的,catch-all 参数只能出现在路由的末尾 - 您发布的代码将引发运行时错误,如果您甚至尝试运行应用程序,就会出现蓝屏死机。

    有几个用于构建自定义路由方案的扩展点。它们是 - Route、RouteBase 和 IRouteHandler。

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

    public class MyRoute : RouteBase
    {
    private List<Route> _routes = new List<Route>();

    public MyRoute(string resource)
    {
    // make a Resource property, not shown in this example
    this.Resource = resource;

    // Generate all your routes here
    _routes.Add(
    new Route("some/url/{param1}",
    new McvRouteHandler {
    Defaults = new RouteValueDictionary(new {
    controller = resource,
    action = actionName
    }),
    Constraints = new RouteValueDictionary()
    );
    _routes.Add(...); // another new route
    }

    public override RouteData GetRouteData(HttpContextBase context)
    {
    foreach (var route in _routes)
    {
    var data = route.GetRouteData(context);
    if (data != null)
    {
    return data;
    }
    }
    return null;
    }

    public override VirtualPathData GetVirtualPath(RequestContext context, RouteValueDictionary rvd)
    {
    foreach (var route in _routes)
    {
    var path = route.GetVirtualPath(context, rvd);
    if (path != null)
    {
    return path;
    }
    }
    return null;
    }
    }

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

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

    整个框架是非常可扩展的,但你需要学习很多才能正确地做到这一点。如果可能的话,我建议简单地重新排列您的 URL,以利用 catch-all 参数。

    关于asp.net-mvc - ASP.net MVC 自定义路由处理程序/约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1107507/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com