我知道标题很难理解,但我会尝试解释。我有一个Employees数据库,一个连接到脚本的html页面和我的web api应用程序中的控制器。所以,当我点击我的html页面上的一个按钮时,相关的javascript脚本会在我的控制器上发送一个帖子请求。控制器访问数据库并将 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); 应该打印返回的第一个员工的姓名,但不是。你能帮我理解如何正确访问这些信息吗?
答案 0 :(得分:1)
您的Employee实体具有Name
属性,但在Javascript中您尝试读取name
属性,该属性不存在。您可以尝试console.log(result)
结果只是为了看到api没问题。
我注意到的一些事情,你应该解决它:
由于这是一个简单的Get of Employees,你应该使用Http Get,而不是帖子。 (API /员工?名称= JOHN)
考虑在查询结束时调用.ToList()
,因为没有它,您将返回一个IQueryable,并且您可能不是您想要的,因为您将它分配给IEnumerable。 / p>
您可以将代码简化为:
[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并返回它。
答案 1 :(得分:1)
.NET
序列化为属性创建字符串,如果您没有使用属性标记属性,则会覆盖标准序列化。
因此,Name
类的属性Employee
将被序列化为Name
而不是name
,而您正试图准确地name
取代Name
在javascript中$.post("api/employees", { '' : insertedText}, function (result) {
console.log(result[0].Name);
});
。
尝试按以下方式修改脚本:
Started GET "/pt/users/undefined/edit" for 163.53.151.26 at 2016-10-20 03:19:25 -0400 ActiveRecord::SchemaMigration Load (1.8ms) SELECT "schema_migrations".* FROM "schema_migrations" Processing by UsersController#edit as HTML Parameters: {"id"=>"undefined", "locale"=>"pt"} User Load (2.3ms) SELECT "users".* FROM "users" WHERE "users"."deactivated_at" IS NULL AND "users"."id" = 0 ORDER BY "users"."id" ASC LIMIT 1 Rendered catarse_bootstrap/devise/shared/_header.html.slim (7.9ms) Rendered catarse_bootstrap/errors/not_found.html.slim within layouts/catarse_bootstrap (600.2ms) Rendered catarse_bootstrap/layouts/_analytics.html.slim (9.8ms) User Load (1.7ms) SELECT "users".* FROM "users" WHERE "users"."id" = 1 ORDER BY "users"."id" ASC LIMIT 1
答案 2 :(得分:0)
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();
}