Я пытаюсь опубликовать несколько параметров на контроллере WebAPI. Один параметр взят из URL, а другой из тела. Вот URL:
/offers/40D5E19D-0CD5-4FBD-92F8-43FDBB475333/prices/
Вот мой код контроллера:
public HttpResponseMessage Put(Guid offerId, OfferPriceParameters offerPriceParameters)
{
//What!?
var ser = new DataContractJsonSerializer(typeof(OfferPriceParameters));
HttpContext.Current.Request.InputStream.Position = 0;
var what = ser.ReadObject(HttpContext.Current.Request.InputStream);
return new HttpResponseMessage(HttpStatusCode.Created);
}
Содержимое тела в формате JSON:
{
"Associations":
{
"list": [
{
"FromEntityId":"276774bb-9bd9-4bbd-a7e7-6ed3d69f196f",
"ToEntityId":"ed0d2616-f707-446b-9e40-b77b94fb7d2b",
"Types":
{
"list":[
{
"BillingCommitment":5,
"BillingCycle":5,
"Prices":
{
"list":[
{
"CurrencyId":"274d24c9-7d0b-40ea-a936-e800d74ead53",
"RecurringFee":4,
"SetupFee":5
}]
}
}]
}
}]
}
}
Любая идея, почему связывание по умолчанию не в состоянии связать с offerPriceParameters
аргументом моего контроллера? Он всегда равен нулю. Но я могу восстановить данные из тела, используя DataContractJsonSerializer
.
Я также пытаюсь использовать FromBody
атрибут аргумента, но он также не работает.
.net
asp.net-web-api
Норманд Бедард
источник
источник
Собственно WebAPI не поддерживает привязку нескольких параметров POST. Как указывает Колин, в моем блоге он упоминает .
Существует обходной путь, создавая пользовательскую привязку параметров. Код для этого уродлив и запутан, но я разместил код вместе с подробным объяснением в своем блоге, готовый для включения в проект здесь:
Передача нескольких простых значений POST в ASP.NET Web API
источник
Если используется маршрутизация атрибутов, вы можете использовать атрибуты [FromUri] и [FromBody].
Пример:
источник
[FromRoute]
вместо[FromUri]
Мы передали объект Json методом HttpPost и проанализировали его в динамическом объекте. это работает отлично. это пример кода:
WebAPI:
Сложный тип объекта может быть объектом, массивом и словарем.
источник
Простой класс параметров может использоваться для передачи нескольких параметров в сообщении:
источник
Вы можете разрешить несколько параметров POST, используя класс MultiPostParameterBinding из https://github.com/keith5000/MultiPostParameterBinding
Чтобы использовать это:
1) Загрузите код в папку « Исходный код » и добавьте его в проект веб-API или любой другой проект решения.
2) Используйте атрибут [MultiPostParameters] для методов действия, которые должны поддерживать несколько параметров POST.
3) Добавьте эту строку в Global.asax.cs в метод Application_Start в любом месте перед вызовом GlobalConfiguration.Configure (WebApiConfig.Register) :
4) Пусть ваши клиенты передадут параметры как свойства объекта. Пример объекта JSON для
DoSomething(param1, param2, param3)
метода:Пример JQuery:
Посетите ссылку для более подробной информации.
Отказ от ответственности: я напрямую связан со связанным ресурсом.
источник
Хороший вопрос и комментарии - узнал много из ответов здесь :)
В качестве дополнительного примера, обратите внимание, что вы также можете смешивать тело и маршруты, например
Звонить так:
источник
Как выглядит ваш routeTemplate для этого случая?
Вы разместили этот URL:
Для того, чтобы это работало, я бы ожидал такую маршрутизацию в вашем
WebApiConfig
:Другие предположения: - Ваш контроллер называется
OffersController
. - объект JSON, который вы передаете в теле запроса, имеет типOfferPriceParameters
(не какой-либо производный тип) - у вас нет никаких других методов на контроллере, которые могли бы помешать этому (если вы это сделаете, попробуйте закомментировать их и посмотреть, что бывает)И, как упоминал Филип, это поможет вашим вопросам, если вы начнете принимать некоторые ответы, так как «процент принятия 0%» может заставить людей думать, что они тратят свое время
источник
Если вы не хотите идти по пути ModelBinding, вы можете использовать DTO для этого. Например, создайте действие POST в DataLayer, которое принимает сложный тип и отправляет данные из BusinessLayer. Вы можете сделать это в случае вызова UI-> API.
Вот образец DTO. Назначьте Учителя ученику и назначьте ученику несколько работ / предмета.
Тогда действие в DataLayer может быть создано как:
Чтобы позвонить с BusinessLayer:
Теперь это все еще будет работать, если я захочу отправить данные нескольких учеников одновременно. Измените
MyAction
как ниже. Не нужно писать [FromBody], WebAPI2 принимает сложный тип [FromBody] по умолчанию.и затем во время вызова передайте
List<StudentCurriculumDTO>
данные.источник
Параметры запроса, такие как
Код веб-API быть как
источник
Вы можете получить formdata в виде строки:
https://docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/sending-html-form-data-part-2
источник