2010-02-05 2 views
1

Это довольно повторяющаяся тема в StackOverflow, но еще раз я не могу заставить свое действие контроллера MVC распознавать данные, которые я пытаюсь отправить. Любые предложения с благодарностью получили.Дополнительные проблемы Ajax/MVC

Мои действия контроллера выглядит следующим образом:

 [Authorize] 
     [HttpPost] 
     public JsonResult Record(int task, string notes, double hours) 
     { 
      Repository<TimeEntry> TimeRepo = new Repository<TimeEntry>(); 
      ... 

Мой Ajax вызов выглядит следующим образом:

var Task = $('#time-task option:selected').val(); 
var Hours = parseFloat($('#time-hours').val()); 
var Notes = $('#txtNotes').val(); 

if (isNaN(Hours)) { 
    Hours = 0; 
} 

$.post('/Home/Record', { task: Task, notes: Notes, hours: Hours }, function (data) { 
    console.log(data); 
}); 

И исключение Возвращается:

Словарь параметров содержит нулевая запись для параметра «задача» не-nullable типа 'System.Int32' f или метод 'System.Web.Mvc.JsonResult Запись (Int32, System.String, Double)' в 'JobTrack.Controllers.HomeController'. Необязательный параметр должен быть ссылочным типом , нулевым типом или быть , объявленным как необязательный параметр . Имя
Параметр: параметры

Там должно быть что-то основное, что я с видом, но проклят, если я могу понять, где я буду неправильно. Предложения оценены.

Обновление: Так что изменение $ .post на $ .ajax-вызов и использование этого вызова GET вместо POST, похоже, сработает. Полагаю, я могу жить с этим, но я бы предпочел сделать это правильно. Любые предложения относительно того, почему HTTP-глаголы должны иметь значение?

ответ

0

ARGH!

Знал, что это будет что-то основное, что я пропустил.

Основной причиной проблемы был файл /Scripts/globals.js, который я даже не рассматривал (и почти полностью забыл). В этом случае у меня был следующий код:

$.ajaxSetup({ 
    type: "POST", 
    contentType: "application/json; charset=utf-8", 
    data: "{}", 
    dataFilter: function(data) { 
     var msg; 

     if (typeof (JSON) !== 'undefined' && 
     typeof (JSON.parse) === 'function') 
      msg = JSON.parse(data); 
     else 
      msg = eval('(' + data + ')'); 

     if (msg.hasOwnProperty('d')) 
      return msg.d; 
     else 
      return msg; 
    } 
}); 

Проблема? Тип содержимого. Мое понимание основной причины заключается в том, что, поскольку я использую jQuery 1.4, тип контента правильно определяется автоматически («application/x-www-form-urlencoded») и явно определяя его снова в глобальных настройках, должно каким-то образом путать вещи ,

Спасибо всем, кто внес вклад в это решение. Если кто-нибудь знает, почему contentType вызывает ошибки Ajax в jQuery, я хотел бы получить более глубокое понимание.

0

Вы, похоже, находитесь на правильном пути - он думает, что вы не передаете задачу, которая может быть преобразована в int.

var Task = $('#time-task option:selected').val(); 
var Hours = parseFloat($('#time-hours').val()); 
var Notes = $('#txtNotes').val(); 

if (isNaN(Task)) { 
    Task = 0; 
} 

if (isNaN(Hours)) { 
    Hours = 0; 
} 

$.post('/Home/Record', { task: Task, notes: Notes, hours: Hours }, function (data) { 
    console.log(data); 
}); 

Если у вас возникли проблемы после этого небольшого изменения, вы можете вызвать метод с фиксированными параметрами, чтобы проверить ваш вызов, прежде чем добавить в переменных.

$.post('/Home/Record', { task: 1, notes: "Hello World", hours: 2 }, function (data) { 
    console.log(data); 
}); 
+0

Ну, это была моя первая мысль, но я проверил в Firebug, и следующие данные находятся в Post Source: 'task = 1 & notes = & hours = 0'. Может быть, значение примечаний вызывает проблемы, но тогда я не думаю, что ASP.Net вызовет меня по значению «задача». –

1

Что произойдет, если объявить параметр задачи, как обнуляемым, как:

public JsonResult Record(int? task, string notes, double hours) 

это усмирить ли ошибка? Is task null, если вы отлаживаете этот код во время разговора?

+0

Установка числовых значений в значение nullable работает, но все же не объясняет, почему значения не передаются. Я могу видеть значения, отправляемые в POST, но мы не достигаем вызова метода. Какие-нибудь идеи? Я думаю, что это должно либо быть чем-то неправильным в том, как значения сериализуются или отформатируются? –

+0

Когда вы это пробовали, did * task * закончил со значением, которое вы передали, или было ли оно нулевым? –

+0

Это было null. Оказывается, значение contentType было установлено и вызывало драмы с настройками jQuery по умолчанию (или что-то еще). –

0

В раскрывающемся списке # время-задачи есть «выбранное» значение при загрузке страницы? если нет, то Task var будет null.

Я бы сказал, что вам нужно сделать 2 вещи:

  1. Установите значение по умолчанию для задачи либо на вашем маршруте, метод контроллера или в JQuery скрипт
  2. Затем «parseFloat» значение для «задачи "так как это типа„Int“на вашем методе контроллера
0

Попробуйте явно посылая тип данных в формате JSON как это:

$.post('/Home/Record', { task: Task, notes: Notes, hours: Hours }, function (data) { 
    console.log(data); 
}, 'json'); 
+0

Нет. Там нет радости. –

1

Попробуйте устранить, упростив. Этот код работает (на моей машине): действие

Контроллер:

public JsonResult TestJson(int someInt, string someString, double someDouble) 
    { 
     return Json(new object[] 
      { 
       someInt, 
       someString, 
       someDouble 
      }); 
    } 

На мой взгляд, я добавил:

<a id="testJson">testJson</a>  

и

<script type="text/javascript"> 
    $("#testJson").click(function() { 
     $.post('/Home/TestJson', 
       { someInt: 1, someString: 'foo', someDouble: 1.1}, 
       function(data) { 
        alert(data); 
       }); 
    });  
    </script> 
+0

Хороший план, но точно такой же результат. –

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