访问javascript端POST请求返回的IEnumerable (web API)

本文关键字:IEnumerable web API 返回 javascript POST 请求 访问 | 更新日期: 2023-09-27 18:13:50

我知道通过标题很难理解,但我会尽量解释。我有员工的数据库,一个html页面连接到一个脚本和控制器在我的web api应用程序。因此,当我单击html页面上的按钮时,相对javascript脚本会在我的控制器上发送一个post请求。控制器访问数据库并返回一个IEnumerable到我的javascript文件。控制器对数据库执行的查询如下:

[HttpPost]
public IEnumerable<Employee> Post([FromBody] string name)
{
    IEnumerable<Employee> query = Enumerable.Empty<Employee>();
    if (!String.IsNullOrEmpty(name))
    {
        query = from e in _db.Employees
        where e.Name.Contains(name)
        select e;
    }
    return query;
}

将此信息传递给脚本。我的问题是,我无法访问从查询返回的单个对象。我调试了代码,并确保查询返回一个Enumerable对象,其中包含我所要求的正确信息。在我的脚本中,我尝试以如下方式访问成员:

$.post("api/employees", { '': insertedText }, function (result) {
console.log(result[0].name);
});

所以调用console.log(result[0].name);应该打印返回的第一个雇员的名字,但是它没有。你能帮助我了解如何正确地获取这些信息吗?

访问javascript端POST请求返回的IEnumerable (web API)

你的雇员实体有一个Name属性,但在Javascript中,你试图读取一个不存在的name属性。您可以尝试console.log(result)的结果,只是为了看到api是好的。

我注意到一些事情,你应该修复它:

  1. 因为这是一个简单的Get of Employees,你应该使用Http Get,而不是post。(api/员工?名字=约翰)

  2. 考虑在查询结束时调用.ToList(),因为没有它,您将返回一个IQueryable,并且您可能不是您想要的,因为您将其分配给IEnumerable。

  3. 你可以这样简化代码:

    [HttpGet]
    public IEnumerable<Employee> Get([FromQuery] string name)
    {
       if (!String.IsNullOrEmpty(name))
       {
           //Return null for brevity, but you should consider
           //returning a message saying no users were found matching the criteria.
           return null;
       }
       return _db.Employees.Where(x => x.Name.Contains(name)).ToList();
    }
    

    对于将来的重构,它通常被认为是一个不好的做法,在你的控制器中返回你的Domain对象,例如你的Employee类。考虑创建一个DTO或ViewModel,然后返回它。

.NET序列化为属性创建字符串,如果您不使用属性标记属性,则会覆盖标准序列化。

所以,你的Employee类的属性Name将被序列化为Name而不是name,你正试图在javascript中获得name而不是Name

试着这样修改你的脚本:

$.post("api/employees", { '' : insertedText}, function (result) {
    console.log(result[0].Name);
});

IEnumerable是一个指针,它没有值。如果你想返回一个值,你必须返回一个列表。

试试这个:

   [HttpPost]
    public IEnumerable<Employee> Post([FromBody] string name)
    {
        IEnumerable<Employee> query = Enumerable.Empty<Employee>();
        if (!String.IsNullOrEmpty(name))
        {
            query = from e in _db.Employees
            where e.Name.Contains(name)
            select e;
        }
        return query.ToList();
    }