2013-10-10 2 views
2

У меня есть объект на стороне сервера в моем коде MVC, который выглядит следующим образом:ASP.NET MVC модель Связывание с запросом Ajax JQuery

class Person 
{ 
    public long Id { get; set; } 

    public string Name { get; set; } 

    public IList<Friend> Friends { get; set; } 
} 

class Friend 
{ 
    public long Id { get; set; } 

    public string Name { get; set; } 
} 

От клиента JQuery, я делаю запрос AJAX и отправка следующих данные (разрывы строк, введенные для удобства чтения):

var personId = $(... 
var personName = $(... 

var friends = []; // array of associative arrays 

for (var i = 0; i < _friends.length; i++) // _friends is is a global array object and is different from friends below 
{ 
    var friendId = $(... 
    var friendName = $(...) 

    friends[i] = { 'Id' : friendId, 'Name' : friendName }; 
} 

... и так далее, чтобы получить значение в переменные

Учитывайте, что я посылаю, что должно войти в Person.Friends, IList<T> как массив JavaScript, где каждый элемент массива представляет собой ассоциативный список, который имеет свойства, подобные классу сервера Friend.

Вот мой Ajax запрос:

$.ajax('/Strings/JsonCreateNew', 
    { 
    cache: false, async: false, type: 'POST', 
    data: { 
     'Id' : personId, 
     'Name' : personName, 
     'Friends' : friends}, 
    dataType: 'json', 
    error: SaveNewFriendClientSideHandler.OnError, 
    success: SaveNewFriendClientSideHandler.OnSuccess 
    }); 

В моем контроллере, до тех пор, пока у меня есть FormCollection получить данные, я получаю все мои данные, но я хотел бы связать с сильно типизированным лицом объект, так что если я изменю свое определение контроллера от:

[HttpPost] 
public ActionResult JsonCreateNew(FromCollection person) 
{ 
    // I get all the data in the person.AllKeys property 
    return new EmptyResult(); 
} 

к:

[HttpPost] 
public ActionResult JsonCreateNew(Person person) 
{ 
    // the default ASP.NET MVC model binder isn't able to bind to this 
    // in fact, the routing module does not even route the request to this 
    // action, so this action never gets fired. 
    return new EmptyResult(); 
} 

Я все еще получаю все свои данные, но меня действительно беспокоит IList<Friend>.

Получено в Person объекта в виде массива, который имеет правильное число Friends объектов с именами свойств (Name и Id), но значения обоих свойств каждого Friend объекта являются null или 0, т.е. не инициализируется, даже когда есть значения, отправленные клиентом.

Пожалуйста, помогите.

ответ

0

Я думаю, что это будет работать:

var p = { 'Id' : personId, 'Name' : personName, 'Friends' : friends }; 
$.ajax('/Strings/JsonCreateNew', 
    { 
    type: 'POST', 
    data: JSON.Stringify({ person : p }), 
    contentType : "application/json", 
    dataType: 'json', 
    error: SaveNewFriendClientSideHandler.OnError, 
    success: SaveNewFriendClientSideHandler.OnSuccess 
    }); 

Также я предпочитаю IEnumerable <> вместо IList <> если вы хотите только перебирать их

Редактировать Контрольный пример:

var friends = new Array(); 
friends.push({ Id: "1", Name: "A" }); 
friends.push({ Id: "2", Name: "B" }); 
var p = { 'Id': 5, 'Name': "Mohammad", 'Friends': friends }; 

$(document).ready(function() { 

    $.ajax('/Home/JsonCreateNew', 
    { 
     type: 'POST', 
     data: JSON.stringify({ person: p }), 
     contentType: "application/json", 
     dataType: 'json', 
     error: function() { alert("f"); }, 
     success: function() { alert("s"); } 
    }); 

}); 
+0

Это не работает.Фактически, это даже сломало отправку запроса ajax. –

+0

@ WaterCoolerv2 Я добавляю тест, и он работает, и я получаю объект person в деле serveride – MRB

+0

@ WaterCoolerv2 Вы должны добавить 'contentType: "application/json"' и 'JSON.stringify()' в ваш запрос ajax, когда я их удалю , я также получаю нулевые значения на сервере – MRB

7

В MVC есть ошибка. Они отказываются исправлять это, если свойство colection y name начинается с имени типа, которое оно не связывает. Изменить

public IList<Friend> Friends { get; set; } 

To:

public IList<Friend> Biscuits { get; set; } 

только временным. Это будет работать.

+0

Прохладный! Звучит неплохо. Я попробую и отправлю обратно. :-) –

+0

Будет ли переименование его работы MyFriends? Это изменило бы его настолько, что свойство больше не начиналось ** с именем типа ... – jrista

+0

Я не помню, если это начало или конец. Но попробуй. – regisbsb

0

Вы должны указать тип контента: contentType: "application/json". Решение @MohammadRB содержит его, но оно должно работать, даже если вы не стягиваете данные сообщения.

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