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;
}