0

无论如何,我可以在同一个 RouteBase 中使用 2 个 try-all 参数吗?

即:我目前有路由:“media/{*key}”,这是一条从 S3 获取媒体文件的自定义路由

出于 SEO 目的:我需要设置另一条路由“media/{*key}/{*name}”,它指向与上述相同的 S3 资源,但在末尾附加了一个名称

目前我在处理路由时创建了一个定制的“StorageServiceRoute”。

然而

var innerRoute = new Route(_routeUrl, this);

无法在 _routURL ("media/{*key}/{*name}") 中有 2 个 try-catch,并且出现如下错误:

包罗万象的参数只能作为路由 URL 的最后一段出现。

在路由中有什么好的方法来处理这个问题吗?提前致谢!

4

2 回答 2

0

您可以编写自定义路线:

public class MediaRoute : Route
{
    public MediaRoute()
        : base(
            "media/{*catchall}",
            new RouteValueDictionary(new
            {
                controller = "Home",
                action = "Index"
            }),
            new MvcRouteHandler()
        )
    {
    }

    public override RouteData GetRouteData(HttpContextBase httpContext)
    {
        var rd = base.GetRouteData(httpContext);
        if (rd == null)
        {
            return null;
        }

        var catchall = rd.GetRequiredString("catchall");
        var tokens = catchall.Split(new[] { '/' }, 2);
        if (tokens.Length > 0)
        {
            rd.Values["key"] = tokens[0];
        }
        if (tokens.Length > 1)
        {
            rd.Values["name"] = tokens[1];
        }

        return rd;
    }
}

可以在以下位置注册Global.asax

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.Add("media", new MediaRoute());

    routes.MapRoute(
        "Default",
        "{controller}/{action}/{id}",
        new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}
于 2012-04-26T08:18:15.607 回答
0

你的路由定义有问题

您的路由 URL 定义存在一个问题,即一个包罗万象的参数何时结束,下一个参数何时开始:

"media/{*key}/{*name}"

如果第一个可以有任意数量的段。第二个也是如此。如果您的路线中可以有另一个静态段,那么事情会更简单。IE。:

"media/{*key}/something/{*name}"

在这种情况下,您可以编写自己的自定义路线,也可以使用我编写的路线。您可以在我的博客文章中找到所有详细信息。

于 2012-04-27T19:18:40.353 回答