Больше проблем с Ajax / MVC - PullRequest
       28

Больше проблем с Ajax / MVC

1 голос
/ 05 февраля 2010

Это довольно повторяющаяся тема в StackOverflow, но еще раз я не могу заставить свое действие контроллера 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);
});

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

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

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

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

Ответы [ 6 ]

1 голос
/ 05 февраля 2010

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

Действие контроллера:

    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>
1 голос
/ 05 февраля 2010

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

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

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

0 голосов
/ 06 февраля 2010

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 голосов
/ 05 февраля 2010

Попробуйте явно отправить тип данных как json, например:

$.post('/Home/Record', { task: Task, notes: Notes, hours: Hours }, function (data) {
    console.log(data);
}, 'json');
0 голосов
/ 05 февраля 2010

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

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

  1. Установите значение по умолчанию для Задачи на вашем маршруте, методе контроллера или в вашем скрипте jQuery
  2. Затем "parseFloat" значение для "Task", так как это тип "Int" в вашем методе контроллера
0 голосов
/ 05 февраля 2010

Вы, похоже, уже на правильном пути - он думает, что вы не проходите задачу, которую можно преобразовать в 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);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...