Возвращает атрибуты из списка с помощью AJAX

#c# #jquery #ajax #asp.net-mvc #asp.net-core

#c# #jquery #ajax #asp.net-mvc #asp.net-core

Вопрос:

В настоящее время я использую AJAX .NET Core. Я пытаюсь сделать очень простую вещь. Заполните список элементов, а затем отобразите каждый элемент в <li> . Проблема в том, что список, который я отправляю, имеет тип, который поступает из моей базы данных. Поэтому, если вы перейдете к моему javascript-коду, после выполнения каждый <li> элемент будет «неопределенным». Я почти уверен, что это происходит потому, что я отправляю весь объект.

Итак, что мне нужно, так это иметь еще один цикл в моем $.each, чтобы выбрать PersonID, PersonName, PersonAddress и отобразить их в строке.

Как новичок в javascript и Ajax, я действительно испытываю трудности, не в состоянии найти какой-либо хороший учебник для asp.net ядро.

Большое спасибо за любой совет

Моя модель:

 public class Person
{
    public int PersonId { get; set; }
    public string PersonName { get; set; }
    public string PersonAddress { get; set; }
}
  

Мой индексный метод:

 public JsonResult OnGetList()
{
    List<Models.Person> list = new List<Models.Person>();

    foreach (var item in _context.Person.ToList())
    {
        list.Add(item);
    }

    return new JsonResult(list);
}
  

Данные из базы данных выглядят следующим образом:

 PersonId PersonName PersonAddress
1        Martin     New York
2        Sam        New Jersey
3        Eli        Ohio
  

Мое мнение:

 <div id="dvItems" style="font-size:24px;">
</div>
  

Javascript, встроенный в нижнюю часть представления:

 <script>
    $.ajax({
        type: "GET",
        url: "/Person?handler=List",
        contentType: "application/json",
        dataType: "json",
        success: function (response) {
            var dvItems= $("#dvItems");
            dvItems.empty();
            $.each(response, function (i, item) {
                var $tr = $('<li>').append(item.PersonId   "with name "   item.PersonName   "living in"   item.PersonAddress).appendTo(dvItems);
            });
        },
        failure: function (response) {
            alert(response);
        }
    });
</script>
  

Комментарии:

1. Можете ли вы опубликовать структуру JSON, response которая возвращается из OnGetList() ?

2. Вы можете проверить свой ответ с помощью инструментов разработчика в вашем браузере. Откройте его с помощью F12 (Firefox, Chrome, Edge) и перейдите на вкладку Сеть, найдите свой запрос XHR и проверьте структуру вашего ответа.

3. ответ [{personId: 25, personName: "martin", personAddress: "strnadova"},…] 0: {personId: 25, personName: "martin", personAddress: "strnadova"} personAddress: "strnadova" personId: 25 personName: "martin" 1: {personId: 26, personName: "barbora", personAddress: "strnadova"} personAddress: "strnadova" personId: 26 personName: "barbora" 2: {personId: 27, personName: "vikca", personAddress: "strnadova"} personAddress: "strnadova" personId: 27 personName: "vikca"

4. вы <li> окружены <ul> ?

5. @sabotero — нет, это не так, но html-часть работает, я вижу там <li> точки, они просто пустые

Ответ №1:

Это не отвечает на первоначальный вопрос, но это стоит упомянуть:

Вы должны (must? из соображений безопасности) создать DTO на стороне сервера ( c# ), который содержит именно то, что вы хотите показать на стороне клиента ( javascript , html ).

Вы могли бы создать что-то вроде:

 public class PersonDto
{
    public string Name {get; }
    public string Address { get;}

    public PersonDto(string name, string address)
    {
       Name = name;
       Address = address;
    }
}
  

затем измените свой код следующим образом:

 public JsonResult OnGetList()
{
    var list = new List<PersonDto>();

    foreach (var item in _context.Person.ToList())
    {
        list.Add(new PersonDto(item.PersonName, item.PersonAddress));
    }

    return new JsonResult(list);
}
  

Комментарии:

1. Спасибо за это — я понятия не имел, что мне следует реализовать эту функцию безопасности. Это то, чем я обязательно буду заниматься в будущем!

Ответ №2:

Я попытался воспроизвести текущий код.

Ваш URL может быть неверным, и вы должны разрешить get в return JSON return Json(list, JsonRequestBehavior.AllowGet)

  public class PersonController : Controller
    {

        public ActionResult Index()
        {
            return this.View();
        }

        public JsonResult OnGetList()
        {
            List<Person> list = new List<Person>();


            foreach (var item in _context.Person.ToList())
            {
                list.Add(item);
            }

            //return Json(list, JsonRequestBehavior.AllowGet);
           return Json(list); // if you use NET Core
        }
}
  

В вашем Index.cshtml измените URL на url: "Person/OnGetList"

 <div id="dvItems" style="font-size:24px;">
</div>
$.ajax({
        type: "GET",
        url: "Home/OnGetList",
        contentType: "application/json",
        dataType: "json",
        success: function (response) {
            var dvItems = $("#dvItems");
            dvItems.empty();
            $.each(response, function (i, item) {
                var $tr = $('<li>').append(item.PersonId   "with name "   item.PersonName   "living in"   item.PersonAddress).appendTo(dvItems);
            });
        },
        failure: function (response) {
            alert(response);
        }
    });
  

Комментарии:

1. Спасибо, что ответили мне — Как я уже говорил в начале, я использую .net Core, JsonRequestBehavior.AllowGet был устаревшим в .net core 1.0, и я не могу его использовать

2. использование может использовать этот возвращаемый Json (список)

3. Я не думаю, что смогу использовать return Json(list) . Что я могу использовать, так это return new JsonResult(list); , что я и использую. Можете ли вы объяснить разницу?

Ответ №3:

Итак, оказывается, есть разница в написании

 var $tr = $('<li>').append(item.PersonId   "with name "   item.PersonName   "living in"   item.PersonAddress).appendTo(dvItems);
  

и

 var $tr = $('<li>').append(item.personId   "with name "   item.personName   "living in"   item.personAddress).appendTo(dvItems);
  

Все атрибуты, записанные в camelCase на стороне Entity Framework, должны содержать первую букву в нижнем регистре.

Какой я глупый…

Спасибо всем, что ответили мне тем же.

Ответ №4:

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

 public class Person
    {
        public int PersonId { get; set; }

        public string PersonName { get; set; }

        public string  PersonAddress { get; set; }

    }
  

Что приводит к результату JSon в виде —

 [{PersonId: 1, PersonName: "Person1", PersonAddress: "Charlotte"},
{PersonId: 2, PersonName: "Person2", PersonAddress: "Chicago"},
{PersonId: 3, PersonName: "Person3", PersonAddress: "Nashville"}]
  

Я использовал действие MVC, чтобы имитировать ваш сценарий. В вашем случае это не должно сильно отличаться.

 public JsonResult Person()
        {
            var personArray = new Person[]
            {
                new Person(){ PersonId = 1, PersonName="Person1", PersonAddress ="Charlotte" },
                new Person(){ PersonId = 2, PersonName="Person2", PersonAddress ="Chicago" },
                new Person(){ PersonId = 3, PersonName="Person3", PersonAddress ="Nashville" }
            };

            return Json(personArray, JsonRequestBehavior.AllowGet); ;
        }
  

Возможно, вам захочется проверить, есть ли разница в структуре классов. Например, пользовательское имя, указанное для сериализатора JSon. Или если эти элементы заключены в некоторые другие объекты в классе.

Надеюсь, это дает некоторую подсказку.

Комментарии:

1. Как я уже говорил в своем вопросе — я использую .net core, поэтому JsonRequestBehavior.AllowGet не может использоваться, поскольку он устарел в asp.net ядро 1.0.