访问 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 是否正常。
我注意到几件事,你应该解决它:
由于这是对员工的简单 Get,您应该使用 Http Get,而不是 post。 (api/employees?name=约翰)
考虑在查询结束时调用 .ToList()
,因为如果没有它,您将 returning 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();
}
对于未来的重构,通常认为 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);
});
我知道标题很难理解,但我会尽力解释。我有一个员工数据库,一个 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 是否正常。
我注意到几件事,你应该解决它:
由于这是对员工的简单 Get,您应该使用 Http Get,而不是 post。 (api/employees?name=约翰)
考虑在查询结束时调用
.ToList()
,因为如果没有它,您将 returning 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(); }
对于未来的重构,通常认为 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);
});