Nancy路由可选的整数参数

时间:2014-05-19 22:10:29

标签: routing nancy

我希望合并两条路线Get["/"]Get["/{value:int}"]

如何?

Get["/{value?:int}"]Get["/{value:int?}"]会返回404错误。

2 个答案:

答案 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;处理程序中的参数。