Вопрос по c#, jquery, asp.net-mvc-3, ajax – asp.net mvc3 возвращает несколько списков json

4

Я asp.net mvc3 c # код возвращает список 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   ответа
5

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

По сути, результат будет содержать name и 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);
        });
слава за ожидание уточнения ОП. отлично сработано.
3

Это предупреждает значение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. You're actually not performing a POST, you're searching based on input. Change POST to GET in your Ajax call
  2. Change your action return line to allow for the get and make sure your are returning a JsonResult.
  3. Naming conventions for C# method parameters call for Pascal-casing. Use a lowercase letter for first character

    public JsonResult Search(string searchText) {
        ....
        return Json(new { name = UserNames, imageUrl = ImageUrls }, JsonRequestBehavior.AllowGet);
    }
    
в вашем случае вы ничего не делаете с i или item, так что вы можете удалить $ each и просто выполнить итерацию, используя & quot; for & quot; мой первый ответ, переданный в result.name - name - это массив, поэтому $. каждый (result.name, ... alert (item); должен работать
Вам действительно нужно делать это внутри $ .each? не может & quot; для & quot; Заявление будет прямо внутри успеха? Согласитесь с изменением POST на GET.
с помощьюalert(item); дает[object][object]....
в.each метод,i каждый объект списка так называется.each наresult перебирает только результат, поэтому первый объект - это первый список, следующий объект - следующий список. Таким образом, для перебора элементов в каждом списке необходим второй цикл. Например, в моем тесте.each(result, function(i, item( { alert[i]; } дает название каждого списка, в моем случаеFirstList а такжеSecondList.
Да, ваш работает в том, что он перебирает список имен, но затем он обходитimageUrl список. Так что я думаю, это просто семантика, как вы называете.each наresult.name а затем второй звонок после этого.each наresult.imageUrl или вы звоните.each наresult а затем внутренняя петля на пунктах каждого списка

Похожие вопросы