Почему моя строка JSON равна нулю на стороне сервера при отправке с использованием www-form-urlencoded?

#c# #asp.net #json #ajax

#c# #asp.net #json #ajax

Вопрос:

У меня есть ASP.NET / MVC4 приложение, использующее jquery / ajax.

Я пытаюсь отправить очень большую строку с клиента на сервер, используя $.ajax( ... )

Прежде всего, мы используем ContentType "application/json" для этого, который работает отлично. Однако в этом конкретном случае сервер выдает исключение, поскольку передаваемые данные слишком длинные. Я перепробовал абсолютно все, чтобы увеличить значение maxJsonLength для десериализатора в файле web.config, но это не работает, и никто не может понять почему.

Кто-то предложил в качестве обходного пути отправить ContentType as "application/x-www-form-urlencoded; charset=UTF-8" , а затем заставить мой контроллер вручную десериализовать объект, а не позволять MVC framework делать это.

Javascript:

 function AjaxRequest(data, dataType, type, url, contentType, success, error, args)
{
    if (url.indexOf("MyController/SomeMethodInMyController") > 0)
        contentType = "application/x-www-form-urlencoded; charset=UTF-8";

    data = JSON.stringify(data);

    $.ajax({async: args.async, cache: args.cache, data: data, dataType: dataType, type: type, url: url, contentType: contentType, traditional: true, headers : { ... }, beforeSend: { ... }, success: { ... }, error: { ... }, complete: { ...});
}

function SomeFunction()
{
    var object = {};
    object.Name = $("#someControl").val();
    object.RtfData = $("someOtherControl").val();

    AjaxRequest(object, 'html', 'post', 'MyController/SomeMethodInMyController', 'application/json;', function (response) { ... }, function (error) { ... });
}
 

В этом случае мое приложение больше не выходит из строя «внутри», когда платформа MVC пытается десериализовать объект самостоятельно. Теперь он обходит все это и напрямую вызывает метод в моем контроллере. Довольно банально, но через 3 дня я возьму то, что смогу получить.

C#:

 public void SomeMethodInMyController(string formData)
{
    JavaScriptSerializer jss = new JavaScriptSerializer();
    jss.MaxJsonLenght = int.MaxValue;

    MyType objMyType = jss.Deserialize<MyType>(formData);

    //do stuff with objMyType
}
 

Проблема в том, что когда я устанавливаю точку останова в этом методе, formData это null .

В консоли моего браузера перед $.ajax(); фактическим выполнением я ввел typeof(data) в консоль, которая возвращает "string" . Если я наведу курсор мыши на символ, я смогу увидеть все данные, которые я ожидаю, что они будут содержать. Итак, почему в моем коде C # значение равно null ?

Ответ №1:

Я думаю, вам нужно отправить объект FormData, а не просто строку. Попробуйте изменить свою AjaxRequest функцию следующим образом:

 function AjaxRequest(data, dataType, type, url, contentType, success, error, args)
{
    if (url.indexOf("MyController/SomeMethodInMyController") > 0)
        contentType = "application/x-www-form-urlencoded; charset=UTF-8";

    var form = new FormData();
    form.append("MyData", JSON.stringify(data));


    $.ajax({processData: false, async: args.async, cache: args.cache, data: form, dataType: dataType, type: type, url: url, contentType: contentType, traditional: true, headers : { ... }, beforeSend: { ... }, success: { ... }, error: { ... }, complete: { ...});
}
 

Комментарии:

1. Это приводит к исключению javascript «незаконное выполнение».

2. Вы имеете в виду «незаконный вызов»? Я обновил ответ, чтобы добавить «ProcessData: false» в настройки ajax — можете ли вы посмотреть, получаете ли вы по-прежнему исключение с ним?

3. Ах, да, моя ошибка. Теперь посмотрим на журнал ошибок: TypeError - Java Script Error : Illegal invocation: at document path 'localhost/myApp'.amp;#xA; at AjaxRequest('[object Object]', 'html', 'post', '/MyController/SomeMethodInMyController', 'application/json;', 'function (response) {amp;#xD;amp;#xA; //if the response is not null we are showing the pop up to download the file.amp;#xD;amp;#xA; тогда просто выдает остальную часть трассировки стека.

4. Я только что увидел вашу правку; Я попробую сейчас … проверка этой ошибки занимает около 10 минут, так что пройдет немного времени, прежде чем я узнаю…

5. Попробуйте также добавить эти два параметра, на всякий случай: ContentType: false, mimeType: «multipart / form-data»