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

时间:2016-10-20 07:36:57

标签: javascript c# ajax asp.net-web-api ienumerable

我知道标题很难理解,但我会尝试解释。我有一个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); 应该打印返回的第一个员工的姓名,但不是。你能帮我理解如何正确访问这些信息吗?

3 个答案:

答案 0 :(得分:1)

您的Employee实体具有Name属性,但在Javascript中您尝试读取name属性,该属性不存在。您可以尝试console.log(result)结果只是为了看到api没问题。

我注意到的一些事情,你应该解决它:

  1. 由于这是一个简单的Get of Employees,你应该使用Http Get,而不是帖子。 (API /员工?名称= JOHN)

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

  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并返回它。

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