2014-02-16 6 views
0

У меня проблема, я не могу понять. Я делаю следующий вызов: АЯКСjquery ajax не публикует данные

var dataArray = { table: "Products" }; 

     $.ajax({ 
      url: uri, 
      type: "POST", 
      cache: false, 
      datatype: "json", 
      data: dataArray 
     }) 
     .done(function(msg) { 
       alert("Data Saved"); 
      }) 
     .fail(function() { 
      alert("error"); 
     }); 

Проблема у меня в том, что это, кажется, не будет посылать то, что я имею в DataArray на мой контроллер Web API, и постоянно возвращается со следующим ответом :

{"Message":"No HTTP resource was found that matches the request URI 'http://myURI'.","MessageDetail":"No action was found on the controller 'MYController' that matches the request."} 

Вещь, которая меня сбивает с толку, заключается в том, что я могу сделать GET, как это, и он возвращает данные в порядке. Кроме того, если я просто прикладываю аппроксимировать запрос на uri, например

http://myURI?table=Products 

тогда POST работает нормально. Я мог бы сделать это таким образом, но мне очень любопытно, что я делаю неправильно в том, как я выше. Благодаря!

Это то, что находится в моем контроллере. Я просто пытаюсь проверить, могу ли я это сделать прямо сейчас.

public void Post(string table) 
    { 
     string beingHit = "We did it!"; 
    } 
+0

'datatype: json,' - вам нужны кавычки вокруг бита JSON, но если вы скажете, что вы можете использовать POST в своей конечной точке, когда у вас есть переменная GET в вашей строке запроса, вам нужно оценить, как ваш контроллер API обрабатывает методы запроса - и размещайте некоторые из этого кода здесь, чтобы мы могли помочь вам с ним. –

+0

Вам также необходимо подкрепить ваши данные. $ .ajax не сделает это автоматически для вас. Используйте что-то вроде https: // github.com/douglascrockford/JSON-js –

+0

@scrowler см. http://stackoverflow.com/questions/13735869/datatype-application-json-vs-json – Musa

ответ

0

Проблема не в том, что вы не отправляете данные в веб-API. Веб-интерфейс не распознает его.

При принятии решения, какие действия в соответствии с просьбой против и как связать параметры, то применяются следующие правила по умолчанию с помощью Web API (от the documentation on asp.net):

По умолчанию Web API использует следующие правила Параметры привязки:

  • Если параметр является «простым», веб-API пытается получить значение из URI. Простые типы включают в себя примитивные типы .NET (int, bool, double и т. Д.), А также TimeSpan, DateTime, Guid, decimal и string, а также любой тип с конвертером типов, который может конвертировать из строки. (Подробнее о преобразователях типов позже.)
  • Для сложных типов Web API пытается прочитать значение из тела сообщения с использованием форматера медиа-типа.

В вашем случае, если вы пытаетесь связать «простой» параметр типа (string). Вы видели, как он работает через запрос. Однако, если вы попытаетесь представить его как часть тела запроса. он по умолчанию не будет распознаваться Web API.

Для того, чтобы получить Web API, чтобы распознать параметр в теле запроса, вам нужно будет указать это в действии подписи с использованием FromBody атрибута:

public void Post([FromBody] string table) 
{ 
    string beingHit = "We did it!"; 
} 

Это покажет Web API, чтобы посмотреть в тело запроса для значения параметра (обратите внимание, что вы можете использовать это только для одного параметра в Action, поэтому для простых типов, таких как это, было бы лучше просто включить их в строку запроса, тогда как [FromBody] идеально подходит для привязки к сложный тип, включенный в тело запроса как Json).

+0

Большое спасибо за объяснение и ссылку на документацию. Очень хорошо объяснил ситуацию и помог мне преодолеть эту ошибку. Я просто собираюсь использовать для этого строку запроса. – chuckw87

Смежные вопросы