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

Accessing IEnumerable returned by a POST request on javascript side (web API)

我知道标题很难理解,但我会尽力解释。我有一个员工数据库,一个 html 页面连接到我的网络 api 应用程序中的脚本和控制器。因此,当我单击 html 页面上的按钮时,相关 javascript 脚本会向我的控制器发送 post 请求。控制器访问数据库和 returns 一个 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;
}

此信息传递给脚本。我的问题是我无法访问查询返回的单个 objects。我调试了代码并确保查询 returns 是一个 Enumerable of objects 包含我询问的正确信息。在我的脚本中,我尝试以以下方式访问成员:

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

所以调用 console.log(result[0].name); 应该打印返回的第一位员工的姓名,但实际上并没有。你能帮助我了解如何正确访问此类信息吗?

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

试试这个:

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

您的 Employee 实体有一个 Name 属性,但在 Javascript 中您正试图读取一个不存在的 name 属性。您可以尝试 console.log(result) 结果,看看 api 是否正常。

我注意到几件事,你应该解决它:

  1. 由于这是对员工的简单 Get,您应该使用 Http Get,而不是 post。 (api/employees?name=约翰)

  2. 考虑在查询结束时调用 .ToList(),因为如果没有它,您将 returning 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();
    }
    

    对于未来的重构,通常认为 return 在控制器中使用域对象是一种不好的做法,例如您的员工 class。考虑创建一个 DTO 或 ViewModel 并 return 代替它。

.NET 序列化会按原样为属性创建字符串,如果您没有用属性标记属性,这会覆盖标准序列化。

因此,您的 Employee class 的 属性 Name 将被序列化为 Name 而不是 name,而您是试图在 javascript.

中准确获取 name 而不是 Name

尝试按如下方式修改您的脚本:

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