2012-06-03 4 views
2

Im asp.net mvc3 C# код возвращает JSON список, как это:asp.net mvc3 вернуть список со множественным JSon

return Json(new { name = UserNames, imageUrl = ImageUrls }); 

UserNames и ImageUrls оба List<string> типа

И это мой Javascript

function StartSearch(text) { 
    $.ajax({ 
     url: '/Shared/Search', 
     type: 'POST', 
     data: { SearchText: text }, 
     dataType: 'json', 
     success: function (result) { 
      $.each(result, function (i, item) { 
       alert(result[i].name); 
      }); 
     } 
    }); 
} 

Как я могу получить имена и ImageUrls?

Благодаря

ответ

2

Это предупреждает значение Name из каждой записи каждого списка.

$.each(result, function (i, item) { 
    for (var x = 0; x < result.FirstList.length; x++) { 
     alert(result.FirstList[x].Name); 
     alert(result.SecondList[x].Name); 
    } 
}); 

Это предполагает, что ваш ответ Json будет сформирован правильно.Как это:

return Json(new { FirstList = results, SecondList = otherResults }, JsonRequestBehavior.AllowGet); 

Но как примечание стороны, я вижу, другие проблемы с кодом, который нужно обратиться

  1. Вы на самом деле не выполняет POST, вы ищете на основе ввода. Измените POST на GET в своем обращении к Ajax
  2. Измените свою обратную линию действия, чтобы разрешить получение и убедитесь, что вы возвращаете JsonResult.
  3. Соглашения об именах для параметров метода C# вызывают необходимость в паскаль-корпусе. Используйте строчную букву первого символа

    public JsonResult Search(string searchText) { 
        .... 
        return Json(new { name = UserNames, imageUrl = ImageUrls }, JsonRequestBehavior.AllowGet); 
    } 
    
+0

Вам действительно нужно сделать это внутри $ .each? Не может ли утверждение «за» быть непосредственно внутри успеха? Согласитесь с изменением POST на GET. –

+0

В методе '.each'' i' - это каждый объект списка, поэтому вызов '.each' на' result' выполняет только итерацию по результату, поэтому первым объектом является первый список, следующий следующий - следующий. Чтобы перебирать элементы в каждом списке, требуется второй цикл. Например, в моем тесте '.each (result, function (i, item ({alert [i];}' дает имя каждого списка, в моем случае 'FirstList' и' SecondList'. –

+0

с использованием 'alert (item); 'дает' [object] [object] .... ' –

5

имя доступа как свойство результата, как этот result.name[i]

По существу, результат будет содержать имя и ImageUrl, которые являются как массивы, так же, как вы определили в вашем анонимном типе, так что ваш код должен модифицировать так, чтобы отобразить предупреждение для каждого имени в массиве имя

function StartSearch(text) { 
    $.ajax({ 
     url: '/Shared/Search', 
     type: 'POST', 
     data: { SearchText: text }, 
     dataType: 'json', 
     success: function (result) { 
      $.each(result.name, function (i, item) { 
       alert(item); 
      }); 
     } 
    }); 
} 

как $each перебирает элементы в массиве имен, он будет передавать элемент ко второму параметру ваш обратный вызов, т. е. элемент.

так

$.each(result.name, function (i, item) { 
    alert(item); 
}); 

всплывет имя каждого.

Примечания:

Вы можете изменить свойства на вашем анонимного типа, чтобы отразить, что они представляют собой набор:

return Json(new { UserNames = UserNames, ImageUrls = ImageUrls }); 

таким образом он будет иметь больше смысла, когда вы итерацию над ними в вашем функция успеха.

Как указал AlfalfaStrange, я не продемонстрировал, как вы можете получить доступ к обеим массивам. Что заставило меня подумать, какова связь между именами пользователей и URL-адресами изображений?

Это список изображений для пользователя? Возможно, вам следует подумать о создании конкретной модели для этого. Например, UserDisplayModel:

public class UserDisplayModel 
{ 
    public string UserName {get;set;} 
    public string ImageUrl {get;set;} 
} 

В контроллере возвращает список UserDisplayModels. Если это так, вам придется переосмыслить, почему они представляют собой два отдельных списка. Возможно, ImageUrl должно быть полем в таблице User.

Итак, когда вы возвращаете один список, например.

List<UserDisplayModel> users = //get users from db 
return Json(new { Users = Users}); 

вы можете перебирать их в один раз в JS код:

 $.each(result.Users, function (i, item) { 
      alert(item.Name); 
      alert(item.ImageUrl); 
     }); 
+0

престижности для ожидания уточнения Ора. отлично сработано. – justSteve

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