无论如何,我可以在同一个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。
在路由中有什么好处理方法吗?提前谢谢!
答案 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找到所有详细信息。