我希望合并两条路线Get["/"]
和Get["/{value:int}"]
。
如何?
Get["/{value?:int}"]
和Get["/{value:int?}"]
会返回404错误。
答案 0 :(得分:3)
我发现你可以为多个GET定义(或任何HTTP动词)分配相同的方法:
Get["/"] = Get["/{value:int}"] = _ => { // method here }
最终的结果是一样的,虽然不是优雅的结果。
答案 1 :(得分:2)
我查看了Nancy源代码(2014/05/20),它看起来不像是为处理路由约束上的可选值而构建的。
CaptureNodeWithConstraint类中的以下代码段似乎执行约束的段匹配。它对':'进行了基本的分割。用于分隔参数名称和约束的字符:
/// <summary>
/// Matches the segment for a requested route
/// </summary>
/// <param name="segment">Segment string</param>
/// <returns>A <see cref="SegmentMatch"/> instance representing the result of the match</returns>
public override SegmentMatch Match(string segment)
{
var routeSegmentConstraint = routeSegmentConstraints.FirstOrDefault(x => x.Matches(constraint));
if (routeSegmentConstraint == null)
{
return SegmentMatch.NoMatch;
}
return routeSegmentConstraint.GetMatch(this.constraint, segment, this.parameterName);
}
private void ExtractParameterName()
{
var segmentSplit = this.RouteDefinitionSegment.Trim('{', '}').Split(':');
this.parameterName = segmentSplit[0];
this.constraint = segmentSplit[1];
}
然后将其转移到约束的GetMatch(,,,)方法,据我所知,其中没有任何内容可以允许可选参数。
我尝试使用各种形式的基于正则表达式的路线创建路线,例如:
Get[@"/(?<value>[\d]{0,3})"] = parameters => "Hello World";
贪婪的正则表达式:
Get[@"^(?<value>[\d]{0,3})$"] = parameters => "Hello World";
但是所有这些都给了我404&#39; /&#39;路由。
我猜这是使用标准路由定义无法完成的。您可能需要执行基本的可选路由,如下所示:
Get[@"/{value?}"] = parameters => "Hello World";
然后添加&#39;值的验证&#39;处理程序中的参数。