访问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);应该打印返回的第一个雇员的名字,但是它没有。你能帮助我了解如何正确地获取这些信息吗?
你的雇员实体有一个Name
属性,但在Javascript中,你试图读取一个不存在的name
属性。您可以尝试console.log(result)
的结果,只是为了看到api是好的。
我注意到一些事情,你应该修复它:
-
因为这是一个简单的Get of Employees,你应该使用Http Get,而不是post。(api/员工?名字=约翰)
-
考虑在查询结束时调用
.ToList()
,因为没有它,您将返回一个IQueryable,并且您可能不是您想要的,因为您将其分配给IEnumerable。 -
你可以这样简化代码:
[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();
}