给出以下路线
config.Routes.MapHttpRoute(
name: "FooBarBazRoute",
routeTemplate: "foo-bar-baz/{id}",
defaults: new
{
controller = "FooBarBaz",
id = RouteParameter.Optional
});
并使用Hyprlinkr
var linker = new RouteLinker(this.Request);
var id = "813bafcc-8329-<trimmed>"
var href = this
.linker
.GetUri<FooBarBazController>(
c => c.Get(id))
.ToString()
href
的值如下所示:
"http://d59503db-1e96-<trimmed>/foobarbaz/813bafcc-8329-<trimmed>"
是否可以自定义Hyprlinkr,以便href
看起来像:
"http://d59503db-1e96-<trimmed>/foo-bar-baz/813bafcc-8329-<trimmed>"
那就是代替 foobarbaz ,如果Hyprlinkr创建 foo-bar-baz ,那就好了 - 类似于路由模板,{{1} }。
答案 0 :(得分:2)
是的,这是可能的。这是Hyprlinkr中存在IRouteDispatcher
接口的主要原因之一。
定义IRouteDispatcher
的自定义实现,如下所示:
public class MyDispatcher : IRouteDispatcher
{
private readonly IRouteDispatcher dispatcher;
public MyDispatcher(IRouteDispatcher dispatcher)
{
this.dispatcher = dispatcher;
}
public Rouple Dispatch(
MethodCallExpression method,
IDictionary<string, object> routeValues)
{
if (method.Method.ReflectedType == typeof(FooBarBazController))
return new Rouple("FooBarBazRoute", routeValues);
return this.dispatcher.Dispatch(method, routeValues);
}
}
使用它来创建RouteLinker
实例:
var linker = new RouteLinker(
request,
new MyDispatcher(new DefaultRouteDispatcher()));
如果您有更多需要发送的命名路由,可以向MyDispatcher.Dispatch
添加更多特殊情况。