jQuery $ .ajax передает нулевое значение контроллеру MVC - PullRequest
1 голос
/ 20 сентября 2011

Я уже давно борюсь с этой проблемой. Я следовал всем предложениям, представленным в подобных проблемах, но безуспешно.

Как видно из названия, данные, переданные моим $.ajax, не получены моим контроллером.

JQuery:

var data = {
    id: id,
    app: app
};


    $.ajax({
        type: "POST",
        url: "/Utility/FetchTransactionLog",
        data: JSON.stringify(data),
        contentType: "application/json;",
        success: function (data) {
            if (data) {
                h.resultDiv.html(data);
            }
            else {
                h.resultDiv.html("");
                alert("No Log Found");
            }
        }
    });

Контроллер:

//id and app receives null values
public ActionResult FetchTransactionLog(string id,string app) {
    UtilityModels util = new UtilityModels(app);
    List<ResultModel> result = util.FetchTransactionLog(id);
    return View("LogResult", result);            
}

Маршрут в Global.asax:

routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}/{id}", // URL with parameters
    new { controller = "Utility", action = "Index", id=UrlParameter.Optional } // Parameter defaults
);

routes.MapRoute(
     "FetchLog",
     "Utility/FetchTransactionLog/{id}/{app}",
     new { controller = "Utility", action = "FetchTransactionLog", id = "", app = "" } // Parameter defaults
 );      

Что я делаю не так?

Обновление

Следующие работы по предложению Самича:

$.ajax({
            type: "POST",
            url: "/Utility/FetchTransactionLog/" + id + "/" + app,
            data: "{}",
            contentType: "application/json;",
            success: function (data) {
                if (data) {
                    h.resultDiv.html(data);
                }
                else {
                    h.resultDiv.html("");
                    alert("No Log Found");
                }
            }
        });

Ответы [ 5 ]

2 голосов
/ 20 сентября 2011

попробуйте просто добавить свой идентификатор и приложение в URL, как вы указали в маршрутах /Utility/FetchTransactionLog/{id}/{app}

Возможно, потому что ваша маршрутизация ожидает значения в строке запроса и не находит его там, поэтому значения по умолчанию предоставляются из регистрации маршрутизации

1 голос
/ 20 сентября 2011

Ваш data не должен быть строкой JSON, просто оставьте его как объект Javascript. jQuery преобразует это в параметры POST, которые ваш контроллер может затем прочитать.

$.ajax({
    type: "POST",
    url: "/Utility/FetchTransactionLog",
    data: data,
    success: function (data) {
        if (data) {
            h.resultDiv.html(data);
        }
        else {
            h.resultDiv.html("");
            alert("No Log Found");
        }
    }
});
1 голос
/ 20 сентября 2011

Почему вы делаете JSON.stringify ваших данных?Вы должны просто передать объект таким, какой он есть, например

data: data,

В документации прямо говорится, что если вы передадите объект, он автоматически преобразуется в строку.Передавая строку , которая содержит JSON, вы вводите в заблуждение jQuery, и в итоге происходит передача данных мусора в ASP (использование инструментов разработчика вашего браузера для проверки запроса немедленно сделало бы это очевидным)).

0 голосов
/ 20 сентября 2011

Попробуйте это:

 $.ajax({
    type: "POST",
    url: "/Utility/FetchTransactionLog",
    data: { id: id, app: app },
    contentType: "application/json;",
    success: function (data) {
        if (data) {
            h.resultDiv.html(data);
        }
        else {
            h.resultDiv.html("");
            alert("No Log Found");
        }
    }
});
0 голосов
/ 20 сентября 2011

В данный момент я не могу проверить это, но попробуйте изменить -

data: JSON.stringify(data), 

на

data: data,

JSON.stringify отформатирует ваши данные таким образом, чтобы jQuery не публиковал ихправильно.Если вы передаете нормальный объект, все должно работать как положено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...