【问题标题】:How to read FormData into WebAPI如何将 FormData 读入 WebAPI
【发布时间】:2019-05-22 17:24:04
【问题描述】:

我有一个 ASP.NET MVC WebApplication,我在其中使用 ASP.NET Web API 框架。

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) {
        // Do something
    },
    error: function (xhr, status, p3, p4) {
        // Do something
    }
});

C# 代码(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" 的值。

我怎样才能得到这个值?

【问题讨论】:

  • 假设你真的在传递一个字符串,在你的方法中添加一个参数[FromBody]string filesToDelete

标签: c# asp.net-mvc asp.net-web-api multipartform-data


【解决方案1】:

我会做的是:

客户端:而不是在查询字符串中传递 clientContactId。在 FormData 对象本身中附加键值对。将数据类型设置为 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...
}

【讨论】:

【解决方案2】:

请使用以下方法获取控制器中的值,

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

【讨论】:

    【解决方案3】:

    我认为来自 ASP.NET 网站的本教程可能是您正在寻找的内容:

    Sending HTML Form Data in ASP.NET Web API: Form-urlencoded Data

    根据您的示例代码,我不确定您是需要来自表单数据的复杂类型,还是仅需要基于 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
        }
    });
    

    查看我上面链接的教程,我认为这可能会更好地为您解释一些事情。

    【讨论】:

      【解决方案4】:

      如果您想像这样使用 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);
          }
      

      【讨论】:

        【解决方案5】:

        要获取“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"];    
                }  
        

        【讨论】:

          【解决方案6】:

          你可以创建dynamic对象

          dynamic data = JsonConvert.DeserializeObject(jsonContent);
          

          那么你就可以访问filesToDeletelike

          data.filesToDelete;
          

          【讨论】:

            猜你喜欢
            • 2016-11-05
            • 2019-12-21
            • 2017-09-06
            • 2021-06-14
            • 2016-02-27
            • 2020-07-01
            • 1970-01-01
            • 1970-01-01
            • 2018-02-10
            相关资源
            最近更新 更多