如何将FormData读入WebAPI

时间:2016-11-25 05:16:20

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

我有一个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"的值。

如何获得此值?

6 个答案:

答案 0 :(得分:7)

我会做的是:

客户端:而不是在查询字符串中传递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获取原始请求。

因此,我们只需使用FormData内的HttpContext.Current.Request.Params["KeyValue"]对象的键值即可获取值。

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

     //Your code here...
}

答案 1 :(得分:0)

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

答案 2 :(得分:0)

获取&#34; filesToDelete&#34;您可以使用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"];    
        }  

答案 3 :(得分:0)

您可以创建dynamic对象

dynamic data = JsonConvert.DeserializeObject(jsonContent);

然后您可以像

一样访问filesToDelete
data.filesToDelete;

答案 4 :(得分:0)

我认为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
    }
});

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

答案 5 :(得分:0)

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

and (
  case.xsa_region is null or
  (
    case.xsa_region is not null
    and country.X_GSA_REGION NOT IN ('Russia','Dummy', 'Other', 'DUMMY')
  )
)