Angularjs [FromBody]中的字节数组和JSON

Angularjs [FromBody]中的字节数组和JSON,angularjs,angular,typescript,asp.net-web-api,asp.net-web-api2,Angularjs,Angular,Typescript,Asp.net Web Api,Asp.net Web Api2,我正在尝试传递一个包含不同数据类型的对象。我总是在Web API中获取orderDetails的空值 但如果这样做, purchaseOrder.Attachments = null, 在客户端中,orderDetails不再为空,我还有其他信息,如“SendEmail”和PurchaseOrderNumber 看起来我可能没有在客户端正确设置参数(angular 2) 不过,从控制台应用程序测试相同的Web Api方法效果很好,我没有得到空值 我需要分离JSON数据和字节数组吗 问候,,

我正在尝试传递一个包含不同数据类型的对象。我总是在Web API中获取orderDetails的空值

但如果这样做,

purchaseOrder.Attachments = null, 
在客户端中,orderDetails不再为空,我还有其他信息,如“SendEmail”和PurchaseOrderNumber

看起来我可能没有在客户端正确设置参数(angular 2)

不过,从控制台应用程序测试相同的Web Api方法效果很好,我没有得到空值

我需要分离JSON数据和字节数组吗

问候,, -艾伦-

模型 这是我的Web API put方法定义 打字脚本片段 更新 orderDetails的创建如下所示

  let file = Observable.create((observer) => {
            let fr = new FileReader();
            let data = new Blob([this.attachment]);
            fr.readAsArrayBuffer(data);
            fr.onloadend = () => {
                observer.next(fr.result);
                observer.complete();
            };
            fr.onerror = (err) => {
                observer.error(err);
            }
            fr.onabort = () => {
                observer.error("aborted");
            }
        });
        file.map((fileData) => {
            //build the attachment object which will be sent to Web API
            let attachment: Attachments = {
                AttachmentId: '0',
                FileName: this.form.controls["attachmentName"].value,
                FileData: fileData
            }
            //build the purchase order object
            let order: UpdatePurchaseOrder = {
                SendEmail: true,
                PurchaseOrderNumber:this.form.controls["purchaseOrderNumber"].value * 1, //for casting purpose
                Attachments: attachment
            }
            console.log("Loading completed");
            return order;
        })

当在客户端之间来回发送具有字节数组作为属性的对象到WebAPI端点时,我通常使用存储该属性的DTO将其显式定义为Base64字符串。在服务器端,我通过将Base64字符串转换为字节数组(用于服务器端操作)并存储在数据库中,将DTO映射到我的实体

序列化程序将自动执行类似的操作,但从JavaScript传递的格式可能与WebAPI JSON序列化程序所期望的格式不匹配(这就是为什么它在C#控制台应用程序中工作)

您没有在JavaScript中包含如何创建purchaseOrder对象,因此我无法评论该对象的设置方式,这可能就是您的问题所在

[HttpPut("AddPurchaseOrderNumber/{purchaseOrderId}")]
       public StatusCodeResult AddPurchaseOrderNumber(int purchaseOrderId, [FromBody] UpdatePurchaseOrderViewModel orderDetails)
       {
           try
           {
               var status = _service.AddPurchaseOrderNumber(purchaseOrderId, orderDetails);
               if (status == 200)
                   _unitOfWorkAsync.SaveChanges();
               else return StatusCode(status);//No Data
           }
           catch
           {
               return StatusCode(400); // Bad Request
           }
           return StatusCode(200);//OK
       }
let headers = new Headers();
headers.append('Content-Type', 'application/json');
headers.append('Accept','application/json');

let options = new RequestOptions({ headers: headers });
var body = JSON.stringify(
                purchaseOrder
            );

var uri = 'http://localhost:33907/api/purchaseorder/addpurchaseordernumber/' + purchaseOrderId;

     return this._http.put(uri, body , options)
            .map((response: Response) => {
             let data = response.json();
             if (data) {
                        return true;
                    }
                    else {
                        return false;
                    }
                })
  let file = Observable.create((observer) => {
            let fr = new FileReader();
            let data = new Blob([this.attachment]);
            fr.readAsArrayBuffer(data);
            fr.onloadend = () => {
                observer.next(fr.result);
                observer.complete();
            };
            fr.onerror = (err) => {
                observer.error(err);
            }
            fr.onabort = () => {
                observer.error("aborted");
            }
        });
        file.map((fileData) => {
            //build the attachment object which will be sent to Web API
            let attachment: Attachments = {
                AttachmentId: '0',
                FileName: this.form.controls["attachmentName"].value,
                FileData: fileData
            }
            //build the purchase order object
            let order: UpdatePurchaseOrder = {
                SendEmail: true,
                PurchaseOrderNumber:this.form.controls["purchaseOrderNumber"].value * 1, //for casting purpose
                Attachments: attachment
            }
            console.log("Loading completed");
            return order;
        })