【问题标题】:Return attributes from list using AJAX使用 AJAX 从列表中返回属性
【发布时间】:2019-03-09 12:18:06
【问题描述】:

我目前正在使用 .NET Core 进行 AJAX。我正在尝试做非常基本的事情。填充项目列表,然后显示<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>

【问题讨论】:

  • 你能发布从OnGetList()返回的JSONresponse的结构吗?
  • 您可以使用浏览器中的开发者工具检查您的回复。使用 F12(Firefox、Chrome、Edge)打开它,然后转到“网络”选项卡,找到您的 XHR 请求并检查您的响应结构。
  • 回复是[{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"
  • 你被&lt;li&gt;s包围了吗&lt;ul&gt;
  • @sabotero - 不,不是,但 html 部分正在工作我可以看到 &lt;li&gt; 点在那里,它们只是空的

标签: c# jquery ajax asp.net-mvc asp.net-core


【解决方案1】:

这并没有回答原来的问题,但值得一提:

您应该(必须?出于安全原因)在服务器端 (c#) 创建一个 DTO,其中包含您想要在客户端显示的内容(javascripthtml)。

你可以创建类似的东西:

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);
}

【讨论】:

  • 谢谢 - 我不知道我应该实现这个安全功能。这是我将来一定会做的事情!
【解决方案2】:

我试图重现当前代码。

您的 URL 可能不正确,您应该允许返回 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);
        }
    });

【讨论】:

  • 感谢您回击我 - 正如我在开始时所说的,我正在使用 .net Core,JsonRequestBehavior.AllowGet 在 .net core 1.0 中已被弃用,我无法使用它
  • 使用可以使用这个返回Json(list)
  • 我认为我不能使用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 编写的所有属性的第一个字母都应为小写。

愚蠢的我......

感谢大家回击我。

【讨论】:

    【解决方案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 序列化程序指定的自定义名称。或者如果这些元素包含在类中的其他一些对象中。

    希望这能提供一些线索。

    【讨论】:

    • 正如我在问题中所说 - 我使用的是 .net 核心,因此不能使用 JsonRequestBehavior.AllowGet,因为它在 asp.net 核心 1.0 中已被弃用。
    猜你喜欢
    • 1970-01-01
    • 2018-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-23
    • 1970-01-01
    • 2012-07-19
    相关资源
    最近更新 更多