如何将FormData读入Web API

我有ASP.NET MVC webapplication我已经添加了webapi webServvices。

我有以下javascript代码。

var data = new FormData(); data.append("filesToDelete", "Value"); $.ajax({ type: "POST", url: "/api/FileAttachment/UploadFiles?clientContactId=" + clientContactId, contentType: false, processData: false, data: data, success: function (result) { }, error: function (xhr, status, p3, p4) { } }); 

以下是WebApi代码:

  public void UploadFiles(int clientContactId) { if (!Request.Content.IsMimeMultipartContent()) { throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); } var jsonContent = Request.Content.ReadAsStringAsync().Result; } 

现在如何根据从javascript FormData传递的键值对读取jsonContent?

我尝试了JsonConvert.DeserializeObject但它需要特殊的类型来反序列化。

我想获得传递给javascript FormData的关键“filesToDelete”的价值。

怎么看?

谢谢

我会做的是:

客户端 :而不是在查询字符串中传递clientContactId。 在FormData对象本身中附加键值对。 将dataType设置为JSON。

 var data = new FormData(); data.append("filesToDelete", "Value"); data.append("clientContactId", (clientContactId != undefined || clientContactId != null) ? clientContactId : '')); $.ajax({ type: "POST", url: "/api/FileAttachment/UploadFiles", /* ONLY IF YOU ARE UPLOADING A FILE contentType: false, processData: false, */ dataType: "JSON" data: data, success: function (result) { }, error: function (xhr, status, p3, p4) { } }); 

服务器端:在服务器端,我们可以使用HttpContext.Current.Request获取原始请求。

因此,我们可以通过简单地使用HttpContext.Current.Request.Params["KeyValue"]FormData对象的键值来获取值。

 [HttpPost] public void UploadFiles() { var filesToDelete = HttpContext.Current.Request.Params["filesToDelete"]; var clientContactId= HttpContext.Current.Request.Params["clientContactId"]; //Your code here... } 

如果要使用JSON发送数据,则应在C#中定义一个与您在JSON中传回的模型匹配的模型。 您的WebApi控制器方法将如下所示:

  public HttpResponseMessage Post([FromBody]WorkerAbsenceModel absence) { bool ok = svc.CreateWorkerAbsence(absence); if (ok) { return Request.CreateResponse(HttpStatusCode.OK); } return Request.CreateResponse(HttpStatusCode.BadRequest); } 

要获取“filesToDelete”值,您可以使用JSON.NET 。 代码:

 public void UploadFiles(int clientContactId) { if (!Request.Content.IsMimeMultipartContent()) { throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); } var jsonContent = Request.Content.ReadAsStringAsync().Result; JObject jObject = JObject.Parse(jsonContent); var filesToDelete = jObject["filesToDelete"]; } 

您可以创建dynamic对象

 dynamic data = JsonConvert.DeserializeObject(jsonContent); 

那么你可以访问filesToDelete类的

 data.filesToDelete; 

我认为ASP.NET网站上的这个教程可能就是你想要的:

在ASP.NET Web API中发送HTML表单数据:表单urlencoded数据

根据您的示例代码,我不确定您是否需要表单数据中的复杂类型,或者只需要基于API控制器中的UploadFiles(int clientContactId)方法的单个整数。 签名使您看起来只是想传递一个整数。 如果是这种情况,您的API控制器方法可能如下所示:

 [HttpPost] public void UploadFiles(int clientContactId) { //access the 'clientContactId' input parameter int id = clientContactId; } 

你的AJAX调用看起来像这样:

 $.ajax({ url: '/api/controller/UploadFiles', //your app url type: 'POST', data: { clientContactId: 12345 }, dataType: 'json', success: function (result) { //do whatever }, error: function (result) { //do whatever } }); 

如果您已经在JavaScript中将数据格式化为JSON,则可以在请求正文中发送它。 Controller方法看起来像这样:

 [HttpPost] public void UploadFiles([FromBody] MyComplexType input) { } 

你的AJAX调用看起来像:

 $.ajax({ url: '/api/controller/UploadFiles', //your app url type: 'POST', data: JSON.stringify(input), dataType: 'json', success: function (result) { //do whatever }, error: function (result) { //do whatever } }); 

看看我上面链接的教程,我想这可能会为你解释一些更好的东西。

请使用以下内容获取控制器中的值,

 var filesToDelete = HttpContext.Request.Params["filesToDelete"]; var clientContactId= HttpContext.Request.Params["clientContactId"];