代码之家  ›  专栏  ›  技术社区  ›  Hypenate

将字符串从角度传递到api

  •  2
  • Hypenate  · 技术社区  · 8 年前

    我想通过Angular在我的ASP.NET核心MVC API控制器中填写一个字符串参数。

    我接到一个工作电话:

    美国石油学会

    //A class to wrap my string
    public class Foo
    {
      public string bar { get; set; }
    }
    
    [HttpPost]
    public JsonResult GetDetails([FromBody] Foo bar) { ... }
    

    角度(服务)

    public get() {
      let bar: any = new Object();
      bar.foo = 'Hello World';
    
      return this._httpClient.post('api/GetDetails', bar).toPromise();
    }
    

    但我真正想要的是传递一个字符串,而不必将它包装在这样的类中:

    美国石油学会

    [HttpPost]
    public JsonResult GetDetails([FromBody] string bar) { ... }
    

    角度(服务)

    public get() {
    let bar: string = "Hello World";
    
    return this._httpClient.post('api/GetDetails', bar).toPromise();
    }
    

    但我得到了一些错误,比如它是不受支持的媒体类型,或者“bar”保持为空。
    什么是只传递一个值的正确语法?
    另一件事是,我可以很好地将一个整数从角度传递到api,但不能传递一个字符串。

    2 回复  |  直到 8 年前
        1
  •  4
  •   Rohìt Jíndal    8 年前

    试试这个:

    let bar = JSON.stringify({'foo' : 'Hello World'});
    let body = new HttpParams();
    body = body.set('bar', bar);
    
    http.post('/api/GetDetails', body).subscribe();
    
        2
  •  1
  •   Thierry Prost    8 年前

    两种方式,取决于你是控制后端还是前端。

    一。角服务 使用页眉 application/json; charset=utf-8 如上所述 here here (注意字符集)

    2.美国石油学会 另一个是建立一个 custom string-binder 派生出一个字符串。

    [HttpPost]
    public JsonResult GetDetails([ModelBinder(typeof(StringBinder))] string bar) { ... }
    

    在哪里?

    public class StringBinder : IModelBinder
    {
        public Task BindModelAsync(ModelBindingContext bindingContext)
        {
            if (bindingContext == null)
                throw new ArgumentNullException(nameof(bindingContext));
    
            using (var sr = new StreamReader(bindingContext.HttpContext.Request.Body))
                Body = sr.ReadToEnd();
    
    
            bindingContext.Result = ModelBindingResult.Success(Model);
    
            return Task.CompletedTask;
        }
    }