Параметр публікації завжди є нульовим


197

З моменту оновлення до RC для WebAPI у мене виникає справжня дивна проблема при виклику POST на моєму WebAPI. Я навіть повернувся до базової версії, створеної для нового проекту. Так:

public void Post(string value)
{
}

і зателефонувавши від Fiddler:

Header:
User-Agent: Fiddler
Host: localhost:60725
Content-Type: application/json
Content-Length: 29

Body:
{
    "value": "test"
}

Коли я налагоджую, рядок "value" ніколи не присвоюється. Це завжди NULL. Хтось має цю проблему?

(Я вперше побачив проблему більш складного типу)

Проблема пов'язана не лише з ASP.NET MVC 4, така ж проблема виникає і для свіжого проекту ASP.NET MVC 3 після встановлення RC


Просто додати проблему - це не виключно JSON, це трапляється і з XML.
ianrathbone

3
Я боровся з цим два дні, і прочитавши кожну статтю, про яку я міг дізнатися про це, виявилося настільки ж просто, як правильно форматувати рядок JSON у WebRequest: Дані повинні починатися і закінчуватися подвійними лапками, і якщо ви тоді використовуйте одинарні котирування у своїх даних json, це все добре.
Gineer

Відповіді:


101

Оскільки у вас є лише один параметр, ви можете спробувати прикрасити його [FromBody]атрибутом або змінити метод, щоб прийняти DTO зі значенням як властивість, як я запропонував тут: Прив'язка параметра MVC4 RC WebApi

ОНОВЛЕННЯ: Офіційний сайт ASP.NET був оновлений сьогодні з відмінним поясненням: https://docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/sending-html-form-data-part- 1

Коротше кажучи, при надсиланні одного простого типу в тілі надсилайте лише значення з префіксом знака рівності (=), наприклад body:

=test


9
Я дав [FromBody] вихор, але це не змінилося
ianrathbone

11
Передайте лише значення (тобто не як об’єкт JSON), і воно повинно працювати, відповідно до blogs.msdn.com/b/jmstall/archive/2012/04/16/…
Джим

8
Додаток =спереду ніколи не працював для мене, поки я не дотримувався порад Джима в його коментарі (не як об’єкт JSON), і воно спрацювало. Це ключове! Мені дуже не подобається, наскільки прискіпливий WebAPI.
gitsitgo

16
Це настільки нерозумно і дратівливо, що я не знаю, чи підкреслити чи зняти відповідь, яка допомогла мені вирішити мою проблему ... Чому на світі це має бути у такому форматі? (Вибачте за таке ставлення, що просто витратили занадто багато часу на це, і це не має сенсу ... :(). Вам слід дійсно додати підтримку формату, який люди очікують, що він прийме.
gdoron підтримує Моніку

6
Дякую! Як на Землі ми повинні знати, що нам потрібно видалити ім'я параметра, надсилаючи лише один параметр? Який пташиний мозок придумав цю ідею?
Дженні О'Рейлі

104

Я сьогодні чухаю голову над цим.

Моє рішення - змінити [FromBody]на аHttpRequestMessage , по суті , рухаючись вгору по HTTP стека.

У моєму випадку я надсилаю дані по дроту, який є блискавкою json, який потім є base64'd. Все це з програми для Android.

Оригінальний підпис моєї веб-кінцевої точки виглядав приблизно так (використовуючи [FromBody]):

Моя оригінальна кінцева точка

Я вирішив цю проблему, щоб повернутися до використання HttpRequestMessageдля підпису моєї кінцевої точки.

введіть тут опис зображення

Потім ви можете отримати доступ до даних публікації за допомогою цього рядка коду:

введіть тут опис зображення

Це працює і дозволяє отримати доступ до необроблених даних про незайману публікацію. Вам не доведеться возитися з fiddler, ставлячи знак = на початку рядка або змінюючи тип вмісту.

В сторону я спершу спробував дотримуватися однієї з вищезазначених відповідей, яка полягала в тому, щоб змінити тип вмісту на: "Content-Type: application / x-www-form-urlencoded". Для необроблених даних це погана порада, оскільки вона викреслює + символи.

Отже, рядок base64, який починається так: "MQ0AAB + LCAAAAAA" закінчується так, як "MQ0AAB LCAAAAAA"! Не те, що ти хочеш.

Ще однією перевагою використання HttpRequestMessageє те, що ви отримуєте доступ до всіх заголовків http із своєї кінцевої точки.


6
Відмінне рішення ... мені знадобилося 9 годин, щоб знайти це, розібрав мою проблему після того, як я видалив [FromBody] значення рядка і замінив його HttpRequestMessage
Kev

1
Працює як шарм! але чи не існує способу використання фактичного типу параметра певного об’єкта? наприклад, параметр типу Замовити для методу веб-api?
Рон Нуні

7
Просто бічна примітка, ви не потребуєте HttpRequestMessage requestв підписі методу, як це завжди є. У тілі методу до нього можна отримати доступ Request. наприкладRequest.Content.ReadAsStringAsync().Result;
Morvael

Зазвичай ця проблема полягає в тому, що ваш об'єкт JSON неправильний. Я виявив, що це завжди тому, що в конструкторі є недійсний тип, і Json не знає, як його перетворити "Як керівництво в рядок. Отже, або додайте перетворювач за допомогою налаштувань, або додайте порожній конструктор, і вам не потрібно повертатися до старого коду, як це.
Нік Тернер

Найпростіший спосіб - переключити об'єкт на рядок, а потім спробувати перетворити його, і ви побачите помилку JSON. Перевірте, чи ви також заголовки.
Нік Тернер

71

У мене щойно це траплялося за допомогою Fiddler. Проблема полягала в тому, що я не уточнив Content-Type.

Спробуйте включити заголовок Content-Typeу свій POST-запит.

Content-Type: application/x-www-form-urlencoded

Крім того, згідно з коментарями нижче, вам може знадобитися включити заголовок JSON

Content-Type: application/json

11
У мене була подібна проблема, за винятком того, що мені потрібно було встановити Content-Type: application / json
dvallejo

2
Як зазначено у публікації - я вже додав Content-Type: application / json
ianrathbone

2
application / x-www-form-urlencoded для мене не працював, Content-Type: application / json.
лянг

1
Незалежно від типу вмісту, якщо у вас є лише один параметр, ви повинні надіслати лише значення без назви параметра в тілі запиту. Тож id = 13 не працюватиме. Вам потрібно надіслати 13 поодинці. Дивіться відповідь Джима.
Jenny O'Reilly

Мені довелося скористатися contentType: "application/x-www-form-urlencoded; charset=UTF-8", щоб отримати повний приклад див. Повний Коефіцієнт та Сервер
RyBolt

57

Я також зіткнувся з цією проблемою, і саме так я вирішив свою проблему

код webapi:

public void Post([FromBody] dynamic data)
{
    string value = data.value;
    /* do stuff */
}

код клієнта:

$.post( "webapi/address", { value: "some value" } );

1
Це працює, якщо клієнт надсилає JSON. Якщо я надсилаю таке просте значення, як рядок some value, то dataце null.
brianestey

легко, змініть код клієнта, щоб надіслати назад js-об’єкт.
Джордж

Чудовий і чистий спосіб отримати дані з JSON
Wouter Vanherck

Якщо ви надсилаєте json, тоді var json = JsonConvert.SerializeObject (дані);
dvallejo

41

Я використовував Postmanі робив ту саму помилку .. передаючи valueоб’єкт як json замість рядка

{
    "value": "test"
}

Очевидно, що вищезгаданий помилковий, коли параметр api є рядком типу.

Отже, просто передайте рядок у подвійних лапки в тілі api:

"test"

2
Це було моїм питанням, і, ймовірно, реальним вирішенням питання. Рядок, кодований JSON, має лапки
Kyle W

1
Я також зіткнувся з цим питанням на «Листоноші». Виявляється, я неправильно вибрав "form-data" замість "raw" для Body, коли для Content-Type встановлено додаток / json. Ви можете посилатися на скріншоти zzyykk123456 у випуску aspnet Github: github.com/aspnet/Home/isissue/2202
Chun Lin

Це працювало для мене. Використовуючи Swagger (swashbuckle), я повинен встановити Тип вмісту: application / json і використовувати подвійні лапки.
Джон Генкель

1
Точно мій випуск, але мушу зазначити, що в запитах Ajax ви повинні робити "data: JSON.stringify (" YourString ")"
Амір Хосейн Ахмаді

1
@AmirHosseinAhmadi Я щойно стикався з цим на ajax і бачив, що насправді використання JSON.stringifyзмусило мене [frombody]стати null. Після встановлення поля даних значенням рядка (тобто рядком json) воно працювало.
Nexaspx

19

Спробуйте створити клас, який слугуватиме моделлю даних, а потім надішліть об’єкт JSON із властивостями, що відповідають властивостям вашого класу моделі даних. (Примітка. Я перевірив це, і він працює з найновішим MVC 4 RC 2012, який я щойно завантажив).

public HttpResponseMessage Post(ValueModel model)
{
    return Request.CreateResponse<string>(HttpStatusCode.OK, "Value Recieved: " + model.Value);
}

public class ValueModel
{
    public string Value { get; set; }
}

Наведений нижче об'єкт JSON надсилається в тіло HTTP-POST, тип вмісту - це application / json

{ "value": "In MVC4 Beta you could map to simple types like string, but testing with RC 2012 I have only been able to map to DataModels and only JSON (application/json) and url-encoded (application/x-www-form-urlencoded body formats have worked. XML is not working for some reason" }

Я вважаю, що причина, чому ви повинні створити клас моделі даних, полягає в тому, що прості значення приймаються з параметрів url, а єдине комплексне значення вважається з тіла. У них є [FromBody]і [FromUrl]атрибути, але використання [FromBody] string valueдосі не працювало для мене. Здається, вони все ще працюють з великою кількістю помилок, тому я впевнений, що це зміниться в майбутньому.

Редагувати: XML повинен працювати в тілі. Стандартний серіалізатор XML змінено на DataContractSerializer замість XmlSerializer. Якщо розмістити наступний рядок у моєму файлі Global.asax виправлено цю проблему ( посилання )

GlobalConfiguration.Configuration.Formatters.XmlFormatter.UseXmlSerializer = true;

це працювало для мене із запитом.ContentType = "application / json; charset = UTF-8";
Арвінд Крмар

15

Після деяких спроб, я вважаю, що поведінка за замовчуванням правильна, і зламати нічого.

Єдина хитрість полягає в тому, що: якщо ваш аргумент методу публікації stringнаведений нижче, ви повинні надіслати просту рядок з подвійними лапками в тілі (під час використання ajax або листоноші), наприклад,

//send "{\"a\":1}" in body to me, note the outer double quotes
[HttpPost("api1")]
public String PostMethod1([FromBody]string value)
{
    return "received " + value; //  "received {\"a\":1}"
}

В іншому випадку, якщо ви надсилаєте рядок json в тіло повідомлення без зовнішніх подвійних лапок і не виходять із внутрішніх лапок, то його слід мати можливість проаналізувати до модельного класу (тип аргументу), наприклад,{"a":1, "b":2}

public class MyPoco{
    public int a;
    public int b;
}

//send {"a":1, "b":2} in body to me
[HttpPost("api2")]
public String PostMethod2([FromBody]MyPoco value)
{
    return "received " + value.ToString();  //"received your_namespace+MyPoco"
}

11

Я кілька хвилин шукав рішення цієї проблеми, тому поділюся своїм рішенням.

Якщо ви розміщуєте модель, модель повинна мати порожній / конструктор за замовчуванням, інакше модель очевидно не може бути створена. Будьте уважні під час рефакторингу. ;)


Рефакторинг - саме те, що мене тут покусало, дякую за пораду!
Алан

10

Це працювало для мене:

  1. Створіть клас C # DTO із властивістю для кожного атрибута, який потрібно передати з jQuery / Ajax

    public class EntityData
    {
        public string Attr1 { get; set; }
        public string Attr2 { get; set; }
    }
  2. Визначте метод веб-api:

    [HttpPost()]
    public JObject AddNewEntity([FromBody] EntityData entityData)
    {
  3. Викличте веб-api як такий:

    var entityData = {
        "attr1": "value1",
        "attr2": "value2"
    };
    
    $.ajax({
        type: "POST",
        url: "/api/YOURCONTROLLER/addnewentity",
        async: true,
        cache: false,
        data: JSON.stringify(entityData),
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (response) {
            ...
        }
    });

Дякую за повідомлення про це, я спробував численні зразки, але це працювало для мене!
Satbir

10

Для тих, хто має таку ж проблему із Swagger або Postman, як і я, якщо ви передаєте простий атрибут як рядок у публікації, навіть із вказаним "ContentType", ви все одно отримаєте нульове значення.

Проходить просто:

MyValue

Буде в контролері як нульове.

Але якщо ви проходите:

"MyValue"

Значення вийде правильно.

Цитати тут змінили значення. Звичайно, це лише для Суаггера та Поштальона. Наприклад, у додатку Frontend, що використовує Angular, це має вирішуватися рамкою автоматично.


6

У мене була та сама проблема, і я виявив, що при зміні типу вмісту на "application / json" проблема не виправлена. Однак "application / json; charset = utf-8" працював.


Так, веб-API не десеріалізується без charset = utf-8. blog.codenamed.nl/2015/05/12/…
Сем Рюбі

4

У мене була подібна проблема, коли об’єкт запиту для мого методу Web API завжди був недійсним. Я помітив, що оскільки ім'я дії контролера було встановлено з позначкою "Отримати", веб-API трактував це як HTTP GET, а не POST. Після перейменування дії контролера він тепер працює за призначенням.


3

Завдяки Angular мені вдалося передати дані в такому форматі:

 data: '=' + JSON.stringify({ u: $scope.usrname1, p: $scope.pwd1 }),
 headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8' }

І в веб-контролері API:

    [HttpPost]
    public Hashtable Post([FromBody]string jsonString)
    {
        IDictionary<string, string> data = JsonConvert.DeserializeObject<IDictionary<string, string>>(jsonString);
        string username = data["u"];
        string pwd = data["p"];
   ......

Крім того, я можу також розмістити такі дані JSON:

    data: { PaintingId: 1, Title: "Animal show", Price: 10.50 } 

І в контролері прийміть такий тип класу:

    [HttpPost]
    public string POST(Models.PostModel pm)
    {

     ....
    }

У будь-якому випадку працює, якщо у вас є встановлений публічний клас в API, тоді публікуйте JSON, інакше дотримуйтесь '=' + JSON.stringify ({..: ..., ..: ...})


3

У моєму випадку проблема полягала в тому, що параметр був рядком, а не об'єктом, я змінив параметр на JObject з Newsoft.Json і він працює.


2

Додавання рядка

        ValueProviderFactories.Factories.Add(new JsonValueProviderFactory());

до кінця функції protected void Application_Start()в Global.asax.cs виправили подібну проблему для мене в ASP.NET MVC3.


Дякую за допомогу, але, на жаль, не допомогло. Я буду тримати лінію на даний момент, оскільки це може допомогти в будь-якому випадку!
ianrathbone

Тільки для того, щоб додати ті самі проблеми, коли я публікую XML
ianrathbone

2

Якщо ви використовуєте DataContractSerializer для свого Xml Formatter або JSON Formatter, його потрібно позбутися. Це було у моєму файлі WebApiConfig:

public static void Register(HttpConfiguration config)
{
     config.Routes.MapHttpRoute(
           name: "DefaultApi",
           routeTemplate: "api/{controller}/{id}",
           defaults: new { id = RouteParameter.Optional }
     );    

     var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().First();
     jsonFormatter.UseDataContractJsonSerializer = true;
}

Просто я коментую, jsonFormatter.UseDataContractJsonSerializer = true;і мій вхідний параметр вже не є нульовим. Завдяки «Деспертару» за те, що він дав мені поняття.


2

Якщо ви впевнені у своєму відправленому JSON, вам слід уважно відстежити свій API:

  1. Встановити Microsoft.AspNet.WebApi.Tracing пакет
  2. Додайте config.EnableSystemDiagnosticsTracing();у WebApiConfigклас всередині Registerметод.

Тепер подивіться на вихід налагодження, і ви, ймовірно, знайдете недійсний ModelState запис журналу.

Якщо ModelStateнедійсний, ви можете знайти справжню причину в його Errors:

Ніхто навіть не може здогадатися про такий виняток:

Could not load file or assembly 'Newtonsoft.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

ти врятував мені життя. Отримавши нуль як модель та встановивши пакет, виявив, що мій JSON не в правильному форматі.
Хізар Ікбал

2

У мене була така ж проблема отримання нуля, як параметр, але це стосувалося великих об’єктів. Виявилося, що проблема була пов'язана з максимальною довжиною IIS. Його можна налаштувати в web.config.

  <system.web>
    <httpRuntime targetFramework="4.7" maxRequestLength="1073741824" />
  </system.web>

Цікаво, чому веб-API придушив помилку і надсилає нульові об’єкти в мої API. Я знайшов помилку за допомогою Microsoft.AspNet.WebApi.Tracing.



1

Я знаю, що це не відповідь на це питання, але я натрапив на це, шукаючи рішення своєї проблеми.

У моєму випадку складний тип не прив'язувався, але я не виконував POST, я робив GET з параметрами запиту рядків. Рішенням було додати [FromUri] до arg:

public class MyController : ApiController
{
    public IEnumerable<MyModel> Get([FromUri] MyComplexType input)
    {
        // input is not null as long as [FromUri] is present in the method arg
    }
}

Це тому, що тіло запиту ігнорується (а іноді викликає помилку) при використанні GET. Причина, по якій це працює зараз, - це те, що ви зараз передаєте парами на рядку запиту, і ваше тіло порожнє, як і повинно бути GET
RyBolt

1

У мене була така ж проблема у Фіддлера. Я вже мав Content-Type: application/json; charset=utf-8або Content-Type: application/jsonв заголовку запиту.

Запит тіло було також проста рядок, а в Fiddler я написав: {'controller':'ctrl'}. Це зробило параметр рядка в моєму методі POST null.

Виправлення : не забудьте використовувати лапки, тим самим вказуючи рядок. Тобто я це зафіксував, написавши "{'controller':'ctrl'}". (Примітка. Коли ви пишете JSON, будь-ласка, використовуйте апострофи або уникайте лапок так:) "{\"controller\":\"ctrl\"}".


Мені довелося зробити те ж саме в Поштальона. Але мені не потрібно цього робити, коли я телефоную на послуги Spring. Схоже, проблема на стороні .Net.
Малькольм МакРобертс

1

Найпростіший спосіб, який я знайшов мати справу з простим об'єктом JSON, який я передаю в MVC 6, - це отримання типу параметра пост, наприклад NewtonSoft jObject:

public ActionResult Test2([FromBody] jObject str)
{
        return Json(new { message = "Test1 Returned: "+ str }); ;
}

Тест ( [FromBody] object body, [FromHeader(Name="Content-Type")] string bodyMediaType) може працювати краще, оскільки перевірка bodyMediaType == "application.json"перед тим, як кинути тіло в JObject, надає можливість альтернативам.
ВладГ

1

Найкраще рішення для мене - це повний HTTP, як показано нижче:

[Route("api/open")]
[HttpPost]
public async Task<string> open(HttpRequestMessage request)
{
    var json = await request.Content.ReadAsStringAsync();
    JavaScriptSerializer jss = new JavaScriptSerializer();            
    WS_OpenSession param = jss.Deserialize<WS_OpenSession>(json);
    return param.sessionid;
}

а потім десеріалізувати рядок до об'єкта, який ви очікуєте в тілі повідомлення. Для мене WS_OpenSession - це клас, який містив sessionid, користувач та ключ.

Ви можете звідти використовувати парам-об'єкт і отримати доступ до його властивостей.

Дуже дуже ефективно.

Я сказав, що отримано з цієї URL-адреси:

http://bizcoder.com/posting-raw-json-to-web-api


1

Для складних типів Web API намагається прочитати значення з тіла повідомлення, використовуючи формат медіа-типу.

Перевірте, чи є у вас такі [Serializable] атрибут, який прикрашає ваш клас моделі.

Видаліть атрибут, щоб побачити, чи працює він. Це працювало для мене.


1

Я трохи запізнююся на вечірку, але кожен, хто натикається на значення NULL, передане при використанні контролера, просто додає "=" на передню частину вашого POST-запиту.

Контролер також передав значення NULL, коли я використовував application / json Content-Type. Зверніть увагу на тип вмісту "application / x-www-form-urlencoded" нижче. Типом повернення з API, однак, є "application / json".

 public static string HttpPostRequest(string url, Dictionary<string, string> postParameters)
    {
        string postData = "=";

        foreach (string key in postParameters.Keys)
        {
            postData += HttpUtility.UrlEncode(key) + "="
                  + HttpUtility.UrlEncode(postParameters[key]) + ",";
        }

        HttpWebRequest myHttpWebRequest = (HttpWebRequest)HttpWebRequest.Create(url);
        myHttpWebRequest.Method = "POST";

        byte[] data = System.Text.Encoding.ASCII.GetBytes(postData);

        myHttpWebRequest.ContentType = "application/x-www-form-urlencoded";
        myHttpWebRequest.ContentLength = data.Length;

        Stream requestStream = myHttpWebRequest.GetRequestStream();
        requestStream.Write(data, 0, data.Length);
        requestStream.Close();

        HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();

        Stream responseStream = myHttpWebResponse.GetResponseStream();

        StreamReader myStreamReader = new StreamReader(responseStream, System.Text.Encoding.Default);

        string pageContent = myStreamReader.ReadToEnd();

        myStreamReader.Close();
        responseStream.Close();

        myHttpWebResponse.Close();

        return pageContent;
    }

1

не має значення, який тип значення ви хочете опублікувати, просто вкладіть його в лапки, щоб отримати його як рядок. Не для складних типів.

javascript:

    var myData = null, url = 'api/' + 'Named/' + 'NamedMethod';

    myData = 7;

    $http.post(url, "'" + myData + "'")
         .then(function (response) { console.log(response.data); });

    myData = "some sentence";

    $http.post(url, "'" + myData + "'")
         .then(function (response) { console.log(response.data); });

    myData = { name: 'person name', age: 21 };

    $http.post(url, "'" + JSON.stringify(myData) + "'")
         .then(function (response) { console.log(response.data); });

    $http.post(url, "'" + angular.toJson(myData) + "'")
         .then(function (response) { console.log(response.data); });

c #:

    public class NamedController : ApiController
    {
        [HttpPost]
        public int NamedMethod([FromBody] string value)
        {
            return value == null ? 1 : 0;
        }
    }

1

Якщо ви помістите анотацію [FromBody] і у вас є об'єкт Dto як параметр вашого методу, і все ще не в змозі отримати дані, починайте шукати властивості та поля вашого DTO.

У мене була ця сама проблема, коли мій DTO став недійсним. Я виявив, що причина полягала в тому, що один із властивостей вказував на об'єкт, який неможливо серіалізувати :( що призводить до того, що медіаформатор не може проаналізувати дані. Таким чином, об'єкт завжди був нульовим. Сподіваюся, він допомагає і іншим


1

Перевірте типи даних. Біндер моделі дотнет не перетворить поплавок на ціле число (і я припускаю інші пов'язані поняття). Це призведе до відхилення всієї моделі.

Якщо у вас є json, такий:

{
    "shoeSize": 10.5
}

але ваша модель c # виглядає так:

class Shoe{
    public int shoeSize;
}

палітурка моделі відхилить модель, і ви отримаєте недійсне.


1

Я досить запізнився на це, але у мене виникли подібні проблеми, і після дня перегляду багатьох відповідей тут і отримання фону я знайшов найпростіше / легке рішення для повернення одного або декількох параметрів для Web API 2 Action як наступним чином:

Це передбачає, що ви знаєте, як налаштувати контролер / дію веб-API за допомогою правильної маршрутизації, якщо це не стосується: https://docs.microsoft.com/en-us/aspnet/web-api/overview/getting-started-with -aspnet-web-api / tutorial-your-first-web-api .

Спочатку Дія контролера, для цього рішення також потрібна бібліотека Newtonsoft.Json.

[HttpPost]
public string PostProcessData([FromBody]string parameters) {
    if (!String.IsNullOrEmpty(parameters)) {
        JObject json = JObject.Parse(parameters);

        // Code logic below
        // Can access params via json["paramName"].ToString();
    }
    return "";
}

Сторона клієнта за допомогою jQuery

var dataToSend = JSON.stringify({ param1: "value1", param2: "value2"...});
$.post('/Web_API_URI', { '': dataToSend }).done(function (data) {
     console.debug(data); // returned data from Web API
 });

Основна проблема, яку я знайшов, - переконатися, що ви надсилаєте назад лише один загальний параметр назад до веб-API та переконайтесь, що він не має імені, а лише значення, { '': dataToSend }інакше ваше значення буде на нулі сервера.

За допомогою цього ви можете надіслати один або кілька параметрів веб-API у структурі JSON, і вам не потрібно оголошувати будь-які додаткові серверні об'єкти для обробки складних даних. JObject також дозволяє динамічно переглядати всі параметри, що передаються, що дозволяє легше масштабувати, якщо ваші параметри змінюються з часом. Сподіваюсь, це допомагає комусь, хто боровся, як я.


0

Правильне передавання одного параметра в тілі WebAPI працює з цим кодом $.post(url, { '': productId }

І ловити це в дії [HttpPost] public ShoppingCartAddRemoveViewModel Delete([FromBody]string value)

Ключовим є використання магічного слова «значення». Це також може бути інт, або якийсь примітивний тип. Незалежно від виправлень типу вмісту чи заголовка. Мес полягає в тому, що цей код не працює в mvc post дії.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.