是否有一个可访问的内置类可以接受路由模板并在其上应用值。我可以自己解析和应用,但如果可用,我宁愿使用内置类。
给定一个模板,例如:
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);