#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»