2

语境

鉴于以下路线

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>"

也就是说,如果 Hyprlinkr 创建foo-bar-baz而不是foobarbaz会更好——类似于路由模板,即.foo-bar-baz/{id}

4

1 回答 1

2

是的,这是可能的。这是IRouteDispatcherHyprlinkr 中存在接口的主要原因之一。

定义 的自定义实现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如果您有更多需要调度的命名路由,则可以添加更多特殊情况。

于 2015-01-05T10:39:30.540 回答