2015-10-01 2 views
2

Мне нужно загрузить файлы в ASP.NET MVC. чистый код javascript работает (см. ниже), но если я конвертирую часть отправки в jQuery, она дает мне ошибку jquery (строка 8458).Как загрузить файл в ASP.NET MVC с помощью jQuery?

ошибка:

0x8000fff - JavaScript runtime error: Argument not optional 
code: 
8453 jQuery.param = function(a, traditional) { 
8454 var prefix, 
8455  s = [], 
8456  add = function(key, value) { 
8457   // If value is a function, invoke it and return its value 
8458   value = jQuery.isFunction(value) ? value() : (value == null ? "" : value); 
8459   s[ s.length ] = encodeURIComponent(key) + "=" + encodeURIComponent(value); 
8460  }; 

HTML:

<form data-bind='submit: upload'> 
    <input type='file' id='fileInput' /> 
    <input type='submit' value='upload' /> 
</form> 

JS:

that.upload = function(){ 
    var data = new FormData(); 
    var fileInput = $('#fileInput')[0]; 
    var file = fileInput.files[0]; 
    data.append(file.name, file); 
    var url = 'blah/Upload?id=' + that.id(); 

    // this pure js works 
    var xhr = new XMLHttpRequest(); 
    xhr.open('post', url); 
    xhr.send(data); 

    // this jquery code does NOT work 
    $.ajax({ 
     type: 'post', 
     dataType: json', 
     url: url, 
     data: data, 
    }); 
}; 

Контроллер:

public JsonResult Upload(string id){ 
    return Json(JsonConvert.SerializeObject(true), JsonRequestBehavior.DenyGet); 
} 
+1

Вам необходимо установить опции 'processData: false 'и' contentType: false, 'ajax (см. [This ответ] (http://stackoverflow.com/questions/29293637/how-to-append-whole-set-of-model-to-formdata-and-obtain-it-in-mvc/29293681#29293681)) –

+0

спасибо вы! это те варианты, которые мне не хватает. –

ответ

3

Вам нужно добавить 2 дополнительных опций Ajax, processData: false и contentType: false

$.ajax({ 
    type: 'post', 
    dataType: json', 
    url: url, 
    data: data, 
    processData: false, // add 
    contentType: false, // add 
    .... 
}); 

Side Примечание: Вы должны использовать Url.Action(), чтобы гарантировать, что Ваш URL правильно генерируется

var url = '@Url.Action("Upload", "blah")', 

и добавить значение id к FormData

data.append(id, that.id);