关于RouteTemplate 举几个例子:
var template = "{p1}/{p2}/{*p3}";
var template = "{controller}/{action}/{id:int=5}“
var template = "cool-{p1}";
var template = "{p1}.{p2}.{p3?}";
上面的引号中的部分称为:RouteTemplate 路由模板。
每一个路由模板包含一个 模板片段的集合:
public List<TemplateSegment> Segments { get; private set; }
反斜杠 ”/" 用来分隔 TemplateSegment 如 {controller}/{action}/{id:int=5} 便是有三个TemplateSegment;
TemplateSegment 中包含一个TemplatePart的集合:
public List<TemplatePart> Parts
{
get { return _parts; }
}
Templatepart 要么是文本 要么是参数 参数举例如:{controller} {id:int=5}
123{a}456{b} 这是一个 TemplateSegment 包含了四个TemplatePart 分别为:123;{a} ;456;{b}. 其中 {a} 和 {b} 为参数。
看一下 TemplatePart 的代码:
[DebuggerDisplay("{DebuggerToString()}")]
public class TemplatePart
{
public static TemplatePart CreateLiteral(string text)
{
return new TemplatePart()
{
IsLiteral = true,
Text = text,
};
}
public static TemplatePart CreateParameter([NotNull] string name,
bool isCatchAll,
bool isOptional,
object defaultValue,
IEnumerable<InlineConstraint> inlineConstraints)
{
return new TemplatePart()
{
IsParameter = true,
Name = name, //参数名称
IsCatchAll = isCatchAll, //剩余部分
IsOptional = isOptional, //可选参数
DefaultValue = defaultValue, // 默认值
InlineConstraints = inlineConstraints ?? Enumerable.Empty<InlineConstraint>(),
};
}
public bool IsCatchAll { get; private set; }
public bool IsLiteral { get; private set; }
public bool IsParameter { get; private set; }
public bool IsOptional { get; private set; }
public bool IsOptionalSeperator { get; set; }
public string Name { get; private set; }
public string Text { get; private set; }
public object DefaultValue { get; private set; }
public IEnumerable<InlineConstraint> InlineConstraints { get; private set; }
internal string DebuggerToString()
{
if (IsParameter)
{
return "{" + (IsCatchAll ? "*" : string.Empty) + Name + (IsOptional ? "?" : string.Empty) + "}";
}
else
{
return Text;
}
}
}
浙公网安备 33010602011771号