Angular2 Http发布到Asp.net 5控制器参数绑定得到null

时间:2016-02-25 10:45:31

标签: angular asp.net-core

这是我的angular2代码

addHero(name: string): Promise<Hero> {
    let body = JSON.stringify({ name: name });
    let headers = new Headers({ 'Content-Type': 'application/json' });
    let options = new RequestOptions({ headers: headers });
    return this.http.post(this._heroUrlPost, name, options)
        .toPromise()
        .then(res => <Hero>res.json().data)
        .catch(this.handleError);
}

在MVC控制器中,我的操作方法如下:

    [HttpPost]
    public JsonResult PostHeroes([FromBody]string name)
    {
        //var name1 = Request.Form["name"].ToString();
        if (!string.IsNullOrEmpty(name))
        {
            var hero1 = new Heroes()
            {
                HeroName = name
            };
            _dbContext.Hero.Add(hero1);
            _dbContext.SaveChanges();
            return Json(new { data = hero1 });
        }
        return Json(new { data="Not Saved"});
    }

我总是得到null。如果我使用复杂的类型我得到属性为null。在这种简单的情况下,如何使它正确吗? 更新:

return this.http.post(this._heroUrlPost, body, options)
        .toPromise()
        .then(res => <Hero>res.json())
        .catch(this.handleError);

1 个答案:

答案 0 :(得分:1)

您的代码暗示您的响应有效负载中有data属性:

return this.http.post(this._heroUrlPost, body, options)
    .toPromise()
    .then(res => <Hero>res.json().data) // <-----
    .catch(this.handleError);

类似的东西:

{
  "data": {
    (...)
  }
}

是这样的吗?你应该使用这个:

return this.http.post(this._heroUrlPost, body, options)
    .toPromise()
    .then(res => <Hero>res.json()) // <-----
    .catch(this.handleError);

修改

我认为你需要发送一个url编码的表单而不是JSON数据。这可以这样做:

addHero(name: string): Promise<Hero> {
  var params = new URLSearchParams();
  params.set('name', name);

  let body = params.toString();
  let headers = new Headers({
    'Content-Type': 'application/x-www-form-urlencoded'
  });
  let options = new RequestOptions({ headers: headers });
  return this.http.post(this._heroUrlPost, name, options)
    .toPromise()
    .then(res => res.json().data)
    .catch(this.handleError);
}

如果您需要将名称作为查询参数传递,请使用:

let options = new RequestOptions({ headers: headers, search: params });

不要忘记导入URLSearchParams课程。 和 控制器方法 public JsonResult PostHeroes(字符串名称)

看到这个问题: