是否有可访问的内置类将路由值应用于路由模板



是否有一个可访问的内置类可以接受路由模板并在其上应用值。我可以自己解析和应用,但如果可用,我宁愿使用内置类。

给定一个模板,例如:

api/[controller]/{action=index}

和值:

controller      foo
action          bar

返回

api/foo/bar

或具有值:

controller      baz

返回

api/baz/index

目前在asp.net核心3.1 上

看起来我可以将TemplateBinderFactory注入控制器并创建TemplateBinder类的实例。然后使用BindValues()方法应用模板。

我想根据我的需要做一些调整,但基本上就是这样。

private readonly TemplateBinderFactory templateBinderFactory;
private string? ParseRouteTemplate(string? template, IDictionary<string, string> routeValues)
{
if (template == null) return template;
var binder = templateBinderFactory.Create(RoutePatternFactory.Parse(template));
return binder.BindValues(new RouteValueDictionary(routeValues));
}

绑定器不太符合我的需求,因为它似乎试图返回可用的URI,而不一定只是盲目地替换我想要的值。在这种情况下,我可以通读解析后的RoutePattern并生成字符串。

在dotnet 3.0之前,您没有TemplateBinderFactory,因此如果您绑定到早期版本(如我(,请参阅TemplateBinderTests.cs了解TemplateBinder的示例用法,例如

// obtain template text from somewhere
// in my case it was a HttpMethodAttribute.Template
var routeTemplate = TemplateParser.Parse(templateText);
var pool = new DefaultObjectPoolProvider().Create(new UriBuilderContextPooledObjectPolicy());
var templateBinder = new TemplateBinder(UrlEncoder.Default, pool, routeTemplate, defaults: null);
var values = new Microsoft.AspNetCore.Routing.RouteValueDictionary();
// set values, e.g. values.Add("...", ...);
var path = templateBinder.BindValues(values);

最新更新