FormData 不会传回 MVC 控制器
FormData doesn't get passed back to MVC Controller
我正在尝试将图像和几个表单元素上传到 MVC 控制器。这里的问题不是没有填充模型,因为它适用于 application/x-www-form-urlencoded
但似乎在 multipart/form-data
上有问题。问题的核心是 Request.Form
没有被填充...
正在将表单转换为表单数据:
function frmValuesAsFormData(submittedForm) {
return new FormData(submittedForm);
}
AJAX 函数(asFormData 在本例中作为 True 传入,方法为 POST,数据类型为 JSON):
function executeAJAX(method, url, data, asFormData, silent, callbackFunc, receiveFunc, dataType, targetDiv, appendToExistingContent, uid) {
var cType = "application/x-www-form-urlencoded";
var processData = true;
if (asFormData) {
cType = "multipart/form-data";
processData = false;
}
$.ajax({
method: method,
url: url,
data: data,
contentType: cType,
cache: false,
dataType: dataType,
processData: processData,
success: function (d, t, j) {
// Do something with result from controller...
}
});
}
POST Headers(来自 FireBug)
Accept application/json, text/javascript, /; q=0.01
Accept-Encoding gzip, deflate Accept-Language en-GB,en;q=0.5
Content-Length 936 Content-Type multipart/form-data Cookie
ASP.NET_SessionId=mzppxvimv03qb0smtyrgdw3z Host localhost:64727
Referer http://localhost:64727/Home/Contact User-Agent Mozilla/5.0
(Windows NT 10.0; Win64; x64; rv:50.0) Gecko/20100101 Firefox/50.0
X-Requested-With XMLHttpRequest
POST 示例(来自 FireBug):
-----------------------------26439188689323 Content-Disposition: form-data; name="imageFiles"; filename="WWKDK33.jpg" Content-Type:
image/jpeg
PNG ��� IHDR��"��"����xÕj��7IDATxÚíÚKÂ
ÐÞÿÒz�B3~Þ,Õb|nHàøÈ!B"D"D!B$!B"D"D!B$
!B"Dcdtå]µ
B"D!BÔKtb_xv-!B"Dunð+¯uÔ"D!BÑS*ï"B"D!B(Õl
B"D!B
ô¢ïü·½ä~"D!B¢URi,ÖÕ"D!BQ/Q:ò[*E"D!B¨a¼ÙôWÿéf"D!B¢]
HæL~eD!B"DöÍ_ÉòGGkA"D!BèD±}Çõò4
!B"DZôÀ½rª�"D!B¢eD¡¡y¡éøk!B
"D!ZGÔ;¯49ÛD!B"D"cöÊ@fåQ^D!B"D®I4_à|Ci@J!B"DÝ(s°
"D!B¢{7 £ÌÁ"D!B"D½DgBæant¿"D!BÑÖý¤ôm
"D!B"D"D!B$!B"A"D!D!B"A"D!ß|ÜYÆ
®«����IEND®B`
-----------------------------26439188689323 Content-Disposition: form-data; name="uploaderMode"
tournament
-----------------------------26439188689323--
有人知道为什么它不起作用吗?谢谢!
问题是因为当您在请求中发送 FormData
object 时,您必须将 contentType
设置为 false
,这样就没有 content-type
header 被发送。试试这个:
if (asFormData) {
cType = false;
processData = false;
}
另请注意,您可以通过检查 data
属性 的类型来完全消除将 asFormData
属性 发送到您的函数的需要:
if (data.constructor == FormData) {
cType = false;
processData = false;
}
我正在尝试将图像和几个表单元素上传到 MVC 控制器。这里的问题不是没有填充模型,因为它适用于 application/x-www-form-urlencoded
但似乎在 multipart/form-data
上有问题。问题的核心是 Request.Form
没有被填充...
正在将表单转换为表单数据:
function frmValuesAsFormData(submittedForm) {
return new FormData(submittedForm);
}
AJAX 函数(asFormData 在本例中作为 True 传入,方法为 POST,数据类型为 JSON):
function executeAJAX(method, url, data, asFormData, silent, callbackFunc, receiveFunc, dataType, targetDiv, appendToExistingContent, uid) {
var cType = "application/x-www-form-urlencoded";
var processData = true;
if (asFormData) {
cType = "multipart/form-data";
processData = false;
}
$.ajax({
method: method,
url: url,
data: data,
contentType: cType,
cache: false,
dataType: dataType,
processData: processData,
success: function (d, t, j) {
// Do something with result from controller...
}
});
}
POST Headers(来自 FireBug)
Accept application/json, text/javascript, /; q=0.01 Accept-Encoding gzip, deflate Accept-Language en-GB,en;q=0.5 Content-Length 936 Content-Type multipart/form-data Cookie ASP.NET_SessionId=mzppxvimv03qb0smtyrgdw3z Host localhost:64727 Referer http://localhost:64727/Home/Contact User-Agent Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:50.0) Gecko/20100101 Firefox/50.0 X-Requested-With XMLHttpRequest
POST 示例(来自 FireBug):
-----------------------------26439188689323 Content-Disposition: form-data; name="imageFiles"; filename="WWKDK33.jpg" Content-Type: image/jpeg
PNG ��� IHDR��"��"����xÕj��7IDATxÚíÚK ÐÞÿÒz�B3~Þ,Õb|nHàøÈ!B"D"D!B$!B"D"D!B$ !B"Dcdtå]µ B"D!BÔKtb_xv-!B"Dunð+¯uÔ"D!BÑS*ï"B"D!B(Õl B"D!B ô¢ïü·½ä~"D!B¢URi,ÖÕ"D!BQ/Q:ò[*E"D!B¨a¼ÙôWÿéf"D!B¢] HæL~eD!B"DöÍ_ÉòGGkA"D!BèD±}Çõò4 !B"DZôÀ½rª�"D!B¢eD¡¡y¡éøk!B "D!ZGÔ;¯49ÛD!B"D"cöÊ@fåQ^D!B"D®I4_à|Ci@J!B"DÝ(s° "D!B¢{7 £ÌÁ"D!B"D½DgBæant¿"D!BÑÖý¤ôm "D!B"D"D!B$!B"A"D!D!B"A"D!ß|ÜYÆ ®«����IEND®B` -----------------------------26439188689323 Content-Disposition: form-data; name="uploaderMode"
tournament -----------------------------26439188689323--
有人知道为什么它不起作用吗?谢谢!
问题是因为当您在请求中发送 FormData
object 时,您必须将 contentType
设置为 false
,这样就没有 content-type
header 被发送。试试这个:
if (asFormData) {
cType = false;
processData = false;
}
另请注意,您可以通过检查 data
属性 的类型来完全消除将 asFormData
属性 发送到您的函数的需要:
if (data.constructor == FormData) {
cType = false;
processData = false;
}