Дополнительные параметры веб-API посередине

У меня есть следующее сопоставление маршрутов или WEB API

[Route("Foo/Id/{id=1}/bar")]

Я хочу сделать Id необязательным, как указано выше, однако со стороны клиента, независимо от того, как я его называю, маршрут не совпадает, и я получаю 404. Я пробую такие вещи, как

Foo/Id//bar

Но не работает. Есть ли способ использовать дополнительные параметры с веб-API, если параметр не находится в конце?


person Onur Gumus    schedule 14.03.2014    source источник
comment
Другой способ сделать это - иметь 2 маршрута и иметь свой ресурс, например: GetFooById(int id = 0). Оба маршрута укажут на это.   -  person majidarif    schedule 17.03.2014
comment
Я знаю, что так, но это невозможно, если количество необязательных параметров растет. В таком случае будет n! маршруты.   -  person Onur Gumus    schedule 18.03.2014
comment
Можете ли вы дать больше информации о том, что вы пытаетесь сделать?   -  person majidarif    schedule 18.03.2014
comment
У меня есть метод с 4 необязательными параметрами, и я хочу написать с ним маршрутизацию атрибутов.   -  person Onur Gumus    schedule 18.03.2014
comment
Вы можете указать значение по умолчанию для параметра option. route.MapHttpRoute(имя: DefaultApi, routeTemplate: Foo/Id/{id}/bar, по умолчанию: новый {id = 0});   -  person Jakub Holovsky    schedule 24.03.2014
comment
@Jakub Это может быть полезно, да, хотя я спрашивал, можно ли это сделать с помощью атрибутов.   -  person Onur Gumus    schedule 24.03.2014


Ответы (4)


Вы не можете использовать // в URL. Единственный способ сделать то, что вы хотите, — это сопоставить 2 маршрута для одной конечной точки. Например

config.Routes.MapHttpRoute(
   name: "BarRoute",
   routeTemplate: "Foo/Id/{id}/bar",
   defaults: new { controller = "Foo" });

config.Routes.MapHttpRoute(
   name: "BarDefaultRoute",
   routeTemplate: "Foo/Id/bar",
   defaults: new { controller = "Foo" });
person bimfh    schedule 07.07.2017

используйте 0 вместо пустого параметра, а при получении 0 используйте его как пустой.

person mohsin139    schedule 24.03.2014
comment
Что, если 0 — реальный параметр? Это не делает это необязательным - person Onur Gumus; 24.03.2014

У меня была аналогичная проблема, и мое решение состояло в том, чтобы сделать атрибут маршрута обнуляемым и передать нулевой аргумент, когда я не хотел указывать значение. Для вас это будет что-то вроде:

[Route("Foo/Id/{id:int?}/bar")]

Затем я обработал нулевое условие в логике действия контроллера. Я думаю, вы могли бы назначить значение по умолчанию в действии контроллера следующим образом (С#):

///<summary>
/// Get my foo's bars
///</summary>
[Route("Foo/Id/{id:int?}/bar")]
public HttpResponseMessage Get(int? id)
{
    var fooId = id ?? 1; // fooId will be of type System.Int32.
    ...

Таким образом, вы можете вызвать любой из них:

~/Foo/Id/null/bar
~/Foo/Id/5/bar

Это решение работает для меня.

person Phil    schedule 02.06.2016

пожалуйста обратитесь к этой статье относительно атрибута маршрута

Вы можете использовать его так и указать значения по умолчанию.

Ваш атрибут будет выглядеть так:

[Route("Foo/Id/{id:int=0}/bar")]

а затем обрабатывать 0, как если бы значения не было (как упоминалось выше).

person Jakub Holovsky    schedule 24.03.2014
comment
Я уже попробовал это, поэтому я задал этот вопрос. Это не работает таким образом. Если вы добавите указанный выше маршрут, Foo/Id//bar просто вернет 404 - person Onur Gumus; 24.03.2014