如何在一个路由MVC 3中设置2个try-all参数

时间:2012-04-26 08:08:51

标签: asp.net-mvc-3 asp.net-mvc-routing

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

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

用于搜索引擎优化目的:我需要设置另一条路线“media / {* key} / {* name}”,它指向与上面相同的S3资源,但在末尾附加名称

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

然而

var innerRoute = new Route(_routeUrl, this);

无法在_routURL中使用2次try-catch(“media / {* key} / {* name}”),我的错误如下:

  

catch-all参数只能显示为路径的最后一段   URL。

在路由中有什么好处理方法吗?提前谢谢!

2 个答案:

答案 0 :(得分: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 }
    );
}

答案 1 :(得分:0)

您的路线定义有问题

您的路由URL定义存在以下问题:何时一个catch-all参数结束并且下一个参数结束:

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

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

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

在这种情况下,您可以编写自己的自定义路由,也可以使用我编写的路径。您可以在my blog post找到所有详细信息。