如何将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"];