自定义Hyprlinkr以使用路径模板的名称

时间:2015-01-03 21:14:45

标签: hyprlinkr

上下文

给出以下路线

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} }。

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添加更多特殊情况。