如何使用ajax上传文件到asp.net mvc控制器动作

时间:2016-08-01 15:55:39

标签: c# jquery ajax asp.net-mvc-3

我有这个提交代码,

$('#form').on('submit',function (e) {
    e.preventDefault();
    //var file = $("#productImg");
    var fileUpload = $("#productImg").get(0);
    var files = fileUpload.files;


    var form = $("#form");
    var formData = new FormData();
    formData.append("product", form.serialize());

    // Looping over all files and add it to FormData object  
    for (var i = 0; i < files.length; i++) {
        formData.append(files[i].name, files[i]);
    }
    //formData.append("file", file);

    $.ajax({
        type: 'POST',
        url: baseUrl + 'Controller/Action',
        data: formData,
        processData: false,
        contentType: false,
        success: function (data) {
        }
    });
});

这是我的控制者:

  public JsonResult AddProduct(ProductModel product) // data is binded in the model if I remove content type property
    {
        var isSuccess = false;

        if (product != null)
        {
            try
            {
                if (Request.Files.Count > 0) // works ok if I added the content type property
                {
                    var sadas = "sad";
                }

所以这里发生的事情是我将serialized form数据与上传的文件一起发送到mvc控制器。

这里的问题是,当我添加这个ajax属性contentType: false,时,我可以成功回发文件,但绑定的模型为空。

另一方面,如果我删除此属性,绑定模型可以正常工作。但问题是文件未在服务器中发送。

我该如何使这项工作?我希望表单和图像都在服务器端发送。

更新 这个现在正在运行,我改变的唯一一行就是这个

formData.append("product", form.serialize());

var other_data = $('#addProductForm').serializeArray(); $.each(other_data, function (key, input) { formData.append(input.name, input.value); });

有人可以解释发生了什么吗?我没有任何线索

2 个答案:

答案 0 :(得分:8)

不幸的是,jQuery serialize()方法不包含输入文件元素。因此,您的文件不会包含在序列化值中。

您可以做的是,创建一个FormData对象,将文件附加到该对象。您还需要将表单字段值附加到此相同的FormData对象。您可以简单地遍历所有输入字段并添加它。

将文件添加到表单数据时,需要提供一个与您在HttpPost操作方法中使用的参数匹配的名称。

这应该有用。

var fileUpload = $("#productImg").get(0);
var files = fileUpload.files;

var formData = new FormData();

// Looping over all files and add it to FormData object  
for (var i = 0; i < files.length; i++) {
    console.log('(files[i].name:' + files[i].name);
    formData.append('productImg', files[i]);
}

// You can update the jquery selector to use a css class if you want
$("input[type='text'").each(function (x, y) {
    formData.append($(y).attr("name"), $(y).val());
});

$.ajax({
    type: 'POST',
    url:  'ReplaceHereYourUrltotheActionMethod',
    data: formData,
    processData: false,
    contentType: false,
    success: function (data) {
    }
});

和您的操作方法,您可以添加另一个类型为IEnumerable<HttpPostedFileBase>的参数,其名称与我们设置的格式相同,即productImg

[HttpPost]
public virtual ActionResult Index(ProductModel model, 
                                               IEnumerable<HttpPostedFileBase> productImg)
{
  // to do :Look through productImg and do something  
}

答案 1 :(得分:0)

对于ASP.NET Core,您可以从模型开始:

public class FilesViewModel
{
    public Guid? ParentObjectId { get; set; } // if you wish to associate these files with some parent record
    public IEnumerable<IFormFile> Files { get; set; }
}

你的控制器:

[HttpPost]
public JsonResult UploadFiles(FilesViewModel model)
{
    if (ModelState.IsValid)
    {
        // your code here
        // see https://docs.microsoft.com/en-us/aspnet/core/mvc/models/file-uploads
    }
}

您的观点(或视图组件):

@model YourProject.ViewModels.EventFilesViewModel
<form method="post" enctype="multipart/form-data">
    <input type="hidden" asp-for="ParentObjectId" />
    <input type="file" asp-for="Files" multiple />
    <span asp-validation-for="Files" class="text-danger"></span>
    <input type="button" id="btnEventFilesUpload" value="Upload Selected Files" class="btn btn-default" />
</form>

最后,javascript(从Shyju的传递ParentObjectId的答案中修改):

$(function () {
    $("#btnEventFilesUpload").click(function (evt) {
        var fileUpload = $("#Files").get(0);
        var files = fileUpload.files;
        var data = new FormData();
        for (var i = 0; i < files.length; i++) {
            data.append('Files', files[i]);
        }
        // if you wish to associate these files with some parent record
        data.append('ParentObjectId', $('#ParentObjectId').val());
        $.ajax({
            type: "POST",
            url: "/Event/UploadFiles",
            contentType: false,
            processData: false,
            data: data,
            success: function (message) {
                alert(message);
            },
            error: function () {
                alert("There was error uploading files!");
            }
        });
    });
});
相关问题