2013-09-14 5 views
4

Хорошо, я видел тонны вопросов отвечал по этому вопросу, но ни один из ответов есть на самом деле работал для меня, вот мой AJAX:MVC Отправить список через AJAX

$.ajax({ 
     url: "/FilterSessions/GetFilterSession", 
     type: "GET", 
     dataType: "json", 
     data: jsonFilters, 
     traditional: true, 
     success: function (response) { 
      //Haha, it's never entering here. not really. 
     } 
    }); 

вар «jsonFilters» содержит массив со следующими данными:

[0] = { Path: "Test", Name: "More testing", Value: "Test Value" }, 
[1] = { Path: "Test", Name: "More testing", Value: "Test Value" } 

И это мой контроллер:

public ActionResult GetFilterSession(List<FilterSessionModel> jsonFilters) 
{ 
    //Do things 

    return Json(false, JsonRequestBehavior.AllowGet); 
} 

jsonFilters всегда остается пустой ... Я также попытался добавить contentType: "application/json; charset=utf-8" на вызов AJAX ... но это не делает ничего

Наконец, класс FilterSessionModel структурирована следующим образом:

public class FilterSessionModel 
    { 
     public string Path { get; set; } 
     public string Name { get; set; } 
     public string Value { get; set; } 
    } 

Все идеи что я могу потерять или что может произойти?

Вещи я пытался до сих пор:

не Установка «традиционны: правда», установка «CONTENTTYPE», используя JSON.stringify и пытается принять строку в контроллер MVC (не годен)

UPDATE: Благодаря ответ ниже я понял, что не хватало, чтобы отправить через данные с Id парам так:

data: "{param1ID:"+ param1Val+"}" 

ответ

1

Я хотел бы попробовать переключение из типа на ваши действия.

List<FilterSessionModel> 

Удостоверьтесь, что выше не будет работать, я бы попробовал нечто вроде Object.

Или, возможно, строка, которую я использовал бы dll newton json для ввода в ваш список классов.

Проблема сводится к тому, что ваше действие неспособно определить тип, предполагая, что вы проверяете свои данные до того, как будет вызван ajax.

** Обновление из-за дополнительной информации. Добавьте часть ошибки и просмотрите эти вары по возвращении с вашего контроллера, также запустите скрипач и посмотрите, что вы получаете за http-номера.

$.ajax({ 
    type: "POST", 
    url: "Servicename.asmx/DoSomeCalculation", 
    data: "{param1ID:"+ param1Val+"}", 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    success: function(msg) { 
     UseReturnedData(msg.d); 
    }, 
    error: function(x, t, m, b) { 
     //Look at the vars above to see what is in them. 
    } 
}); 
+0

Спасибо за ваш ответ, к сожалению, не работает либо; и, кроме того, вы действительно можете использовать пользовательские классы в качестве параметров в контроллерах MVC. MVC автоматически отображает их. Кроме того, я уверен, что я передаю действительные данные - это то же самое, что показано выше. –

+0

Вы, очевидно, добираетесь до своего контроллера, если видите, что данные равны нулю. Я бы попробовал просто передать строку, простую строку и посмотреть, пройдет ли она, если это так, то у вас наверняка возникнут проблемы с вашим вызовом ajax, я добавлю что-то выше в ответ. –

+0

Интересно, что если я передаю строку, контроллер все еще не получает ее. (Я не забыл изменить контроллер, чтобы получить строку) ... Это довольно странно –

0

Во-первых, я делаю предположение, что ваш $.ajax для JQuery, а не какой-либо другой рамочный Javascript. Пожалуйста, поправьте меня, если это неправильно.

ASP.NET MVC может фактически выполнить то, что вы просите (разрешить данные, отправленные через AJAX, в List<FilterSessionModel>, но, похоже, с ним сложно выполнить это с помощью запроса GET. Это поможет узнать, какая версия ASP.NET MVC, который вы используете, поскольку требуется больше, чтобы это работало в более старых версиях. Однако то, что я предлагаю, должно работать на MVC 3 или 4.

При отправке AJAX с помощью JQuery с использованием запроса GET и передавая ей массив JavaScript, это то, что вы отправляете на сервер:

http://localhost:50195/FilterSessions/GetFilterSession?undefined=&undefined= 

Это не удивительно, что модель является недействительным, поскольку нет данных на самом деле послан.

Я считаю, что ASP.NET может принимать объекты (и даже массивы объектов), подобные этому, но это не будет сделано с его форматированием как JSON (например, через JSON.stringify), так как это приводит к следующему запросу:

http://localhost:50195/FilterSessions/GetFilterSession?[{%22Path%22:%22Test%22,%22Name%22:%22TestName%22,%22Value%22:%22Testing%22},{%22Path%22:%22Test%22,%22Name%22:%22TestName%22,%22Value%22:%22Testing%22}] 

Возможно, вы захотите сделать это с помощью запроса POST. ASP.NET MVC фактически примет строку JSON в виде данных POST и расшифрует ее и правильно разрешит модель. Ваш код AJAX прекрасно работает с парой модификаций:

$.ajax({ 
    url: "/FilterSessions/GetFilterSession", 
    type: "POST", //Changed to POST 
    dataType: "json", 
    data: JSON.stringify(jsonFilters), //Pack data in a JSON package. 
    contentType: "application/json; charset=utf-8", //Added so ASP recognized JSON 
    traditional: true, 
    success: function (response) { 
     alert('Success!'); 
    } 
}); 

Контроллер вы вывесили должны признать данные POST уже, но в случае, если это не так, просто [HttpPost] атрибут все, что вам нужно:

[HttpPost] 
public ActionResult GetFilterSession(List<FilterSessionModel> jsonFilters) 
{ 
    //Do things 

    return Json(false, JsonRequestBehavior.AllowGet); 
} 
+0

Спасибо за ваш ответ - ваше предположение об AJAX действительно правильно, и я использую MVC 3. Причина, по которой он не работал, заключается в том, что объект, который я отправлял, был «анонимным» массивом, его нужно было обернуть в объект, который Определено имя параметра (мой вопрос был обновлен, чтобы показать решение). Отправленные данные не были неопределенными, это было просто «не помечено», поэтому контроллер не сопоставил его с параметром. –

1

javascript или ajax call никогда не набирают объект. , . Вам нужно установить тип параметра стороны контроллера либо string, либо List else, который вы также можете установить для типа Object. , Если вы изменили код таким образом .. Ваш код определенно работает !!!

0
$.ajax({ 
    url: "/FilterSessions/GetFilterSession", 
    type: "GET", 
    dataType: "json", 
    data:JSON.stringify({ 'jsonFilters': jsonFilters}), 
    contentType: 'application/json; charset=utf-8', 
    success: function (response) { 
     //Do your action 
    } 
}); 
+2

Пожалуйста, включите в контекст/пояснение код, поскольку это делает его более понятным. – EJoshuaS

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