routepattern-路由模式:通过解析路由模板生成
Microsoft.AspNetCore.Routing.Patterns.RoutePattern instances. Instances
// of Microsoft.AspNetCore.Routing.Patterns.RoutePattern are immutable.
[DebuggerDisplay("{DebuggerToString()}")]
public sealed class RoutePattern
{
public static readonly object RequiredValueAny;
//针对当前路由的优先级
public decimal InboundPrecedence { get; }
public decimal OutboundPrecedence { get; }
//每个路由参数的参数策略保存到这里
public IReadOnlyDictionary<string, IReadOnlyList<RoutePatternParameterPolicyReference>> ParameterPolicies { get; }
//返回RoutePatternParameterPart列表:对所有路由参数的描述
public IReadOnlyList<RoutePatternParameterPart> Parameters { get; }
//
// Summary:
// Gets the list of path segments.
public IReadOnlyList<RoutePatternPathSegment> PathSegments { get; }
//
// Summary:
// Gets the raw text supplied when parsing the route pattern. May be null.
public string RawText { get; }
//指定路由参数值
public IReadOnlyDictionary<string, object> RequiredValues { get; }
//通过指定参数的名称得到对应的RoutePatternParameterPart
public RoutePatternParameterPart GetParameter(string name);
}
}
通过RoutePatternFactory生成RoutePattern对象
建立format方法
public static string Format(RoutePattern pattern)
{
var builder = new StringBuilder();
builder.AppendLine($"RawText:{pattern.RawText}");
builder.AppendLine($"InboundPrecedence:{pattern.InboundPrecedence}");
builder.AppendLine($"OutboundPrecedence:{pattern.OutboundPrecedence}");
var segments = pattern.PathSegments;
builder.AppendLine("segments");
foreach(var segment in segments)
{
foreach(var part in segment.Parts)
{
builder.AppendLine($"{part.ToString()}");
}
}
builder.AppendLine("Defaults");
foreach(var @default in pattern.Defaults)
{
builder.AppendLine($"{@default.Key}={@default.Value}");
}
builder.AppendLine("ParameterPolicy ");
foreach(var policy in pattern.ParameterPolicies)
{
builder.AppendLine($"{policy.Key}={string.Join(',',policy.Value.Select(it=>it.Content))}");
}
builder.AppendLine("RequiredValues");
foreach(var required in pattern.RequiredValues)
{
builder.AppendLine($"{required.Key}={required.Value}");
}
return builder.ToString();
}
生成路由模板并打印各项值
public IActionResult s13()
{
var template = "{fruit}/{days}";
var pat = RoutePatternFactory.Parse(
pattern:template,
defaults:null,
parameterPolicies:null,
requiredValues:new { fruit= "010", days = 3}
);
return Json(Format(pat));
}
结果
"RawText:{city}/{days}\r\nInboundPrecedence:1.1\r\nOutboundPrecedence:3.3\r\nsegments\r\nMicrosoft.AspNetCore.Routing.Patterns.RoutePatternParameterPart\r\nMicrosoft.AspNetCore.Routing.Patterns.RoutePatternParameterPart\r\nDefaults\r\nParameterPolicy \r\nRequiredValues\r\ncity=010\r\ndays=3\r\n"