2012-04-16 4 views
4

У меня есть метод контроллераПочему POST без параметров не возвращает JSON

[HttpPost] 
public ActionResult GetUserData() 
{ 
    return Json(GetCurrentUser()); 
} 

Я звоню ему $ .ajax() через метод, как это:

ServerCall: function (method, args, callback) { 
     $.ajax({ 
      type: 'POST', 
      url: method, 
      data: JSON.stringify(args), 
      contentType: 'application/json;charset=utf8', 
      dataType: 'json', 
      success: function (result) { 
       if (callback) { 
        callback(result); 
       } 
      }, 
      error: function (err) { 
      } 
     }); 
    } 

с призывом быть :

ServerCall('GetUserData', null, function(data){ 
}); 

Как это, когда я делаю этот вызов, $ .ajax возвращается с успехом, но «данных» равно нулю. Отладка, responseText пуст. На стороне сервера вызывается GetUserData, и он возвращает правильно отформатированный объект Json (я дошел до того, что создал свой собственный JSON ActionResult и подтвердил, что данные действительно записываются в поток ответов.

Если добавить фиктивный параметр для метода на стороне сервера:

[HttpPost] 
public ActionResult GetUserData(string temp) 
{ 
    return Json(GetCurrentUser)); 
} 

все работает отлично Браузер IE8 Мой вопрос, может кто-нибудь объяснить, почему это происходит

UPDATE:..?

Примечание обходной путь ниже: все еще заинтересованы в том, чтобы знать основную причину.

ответ

4

Я смог воспроизвести код Дарина в IE8. Хотя я не знаю первопричины, я думаю, что это имеет какое-то отношение к тому, как IE8 JSON.stringify обрабатывает null. Изменение

data: JSON.stringify(args) 

в

data: args ? JSON.stringify(args) : null 

исправили проблему.

Обратите внимание, что проблема прерывистая - я видел сбои примерно в каждом из каждых десяти вызовов. С изменением более 100 тестов частота отказа была равна нулю.

+0

Еще проблема в IE9 –

4

Нет изображения.

Контроллер:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(); 
    } 

    [HttpPost] 
    public ActionResult GetUserData() 
    { 
     return Json(new { foo = "bar" }); 
    } 
} 

Index.cshtml вид:

<script type="text/javascript"> 
    var serverCall = function (method, args, callback) { 
     $.ajax({ 
      type: 'POST', 
      url: method, 
      data: JSON.stringify(args), 
      contentType: 'application/json;charset=utf8', 
      dataType: 'json', 
      success: function (result) { 
       if (callback) { 
        callback(result); 
       } 
      }, 
      error: function (err) { 
      } 
     }); 
    }; 

    serverCall('@Url.Action("GetUserData")', null, function (data) { 
     alert(data.foo); 
    }); 
</script> 

Результат: 'bar' предупреждается (как ожидалось).

+0

Спасибо, что нашли время Дарин. Какой браузер вы испытывали из любопытства? Я должен был указать IE8 на моем конце –

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