【问题标题】:Angular2 Http Post to Asp.net 5 Controller Parameter binding get nullAngular2 Http Post 到 Asp.net 5 控制器参数绑定获取 null
【发布时间】:2016-06-08 02:15:07
【问题描述】:

这是我的 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 Controller中我的Action Method如下:

    [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"});
    }

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

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

【问题讨论】:

  • 我没有发现 Angular 代码有任何问题...所以这可能是服务器问题,我不知道 ASP...

标签: angular asp.net-core


【解决方案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(字符串名称)

看到这个问题:

【讨论】:

  • 如果我调试,我的动作参数为空。我也纠正了这个。
  • action 是查询参数吗?还是响应中的什么?
  • 您回复的内容是什么?您的回复中有Content-Type 标头吗?从浏览器开发工具的“网络”选项卡...
  • 响应很好。我无法发送数据。我在名称参数中得到空值。
  • 这不会在控制器方法中设置名称。
猜你喜欢
  • 2016-05-27
  • 1970-01-01
  • 2012-07-04
  • 1970-01-01
  • 2021-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-05
相关资源
最近更新 更多