Маршрутизация Нэнси для необязательных целочисленных параметров

Я хочу объединить два маршрута Get["/"] и Get["/{value:int}"].

Как?

Get["/{value?:int}"] и Get["/{value:int?}"] возвращают ошибку 404.


person user2217261    schedule 19.05.2014    source источник
comment
это работает, если вы отбросите ограничение int?   -  person Christian Horsdal    schedule 20.05.2014
comment
да. Получить[/{значение?}] работает.   -  person user2217261    schedule 20.05.2014


Ответы (2)


Я обнаружил, что вы можете назначить один и тот же метод для нескольких определений GET (или любого HTTP-глагола):

Get["/"] = Get["/{value:int}"] = _ => { // method here }

Конечный результат тот же, хотя и не элегантный.

person Community    schedule 11.12.2014

Я просмотрел исходный код Нэнси (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 для маршрута '/'.

Я предполагаю, что это невозможно сделать, используя стандартные определения маршрутизации. Возможно, вам придется выполнить базовый необязательный маршрут, например:

Get[@"/{value?}"] = parameters => "Hello World";

А затем добавьте проверку параметра «значение» в свой обработчик.

person ctrlplusb    schedule 20.05.2014
comment
Get[/{value?}] и Get[/{value:int}] допустимы, но не их комбинация. См. github.com/NancyFx/Nancy/wiki/Defining-routes. - person user2217261; 20.05.2014
comment
кажется правдой, что это не поддерживается. Не стесняйтесь открывать вопрос на github (github.com/NancyFx/Nancy/issues ?milestone=28&state=open). Было бы хорошо иметь это. - person Christian Horsdal; 20.05.2014
comment
У нас были проблемы с этим в течение некоторого времени. Взгляните на github.com/NancyFx/Nancy/issues/1377 и github.com/NancyFx/Nancy/issues/1418 - person khellang; 20.05.2014