Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将原始复杂对象传递给MVC操作?_C#_Jquery_Ajax_Model View Controller - Fatal编程技术网

C# 如何将原始复杂对象传递给MVC操作?

C# 如何将原始复杂对象传递给MVC操作?,c#,jquery,ajax,model-view-controller,C#,Jquery,Ajax,Model View Controller,问题:无法将文件对象解析为JSON字符串,在尝试将复杂类型发送到MVC控制器时,仅获取空值 我尝试将其添加到FormData对象中并将其传递给控制器,但是,传递它们的列表并没有成功,因为它要么返回空数组,要么返回纯null 型号: 公共类上载文档 { 公共HttpPostedFile文件{get;set;} 公共字符串DocumentId{get;set;} 公共字符串DocumentType{get;set;} } 控制器: [HttpPost] [ActionNameUploadFile]

问题:无法将文件对象解析为JSON字符串,在尝试将复杂类型发送到MVC控制器时,仅获取空值

我尝试将其添加到FormData对象中并将其传递给控制器,但是,传递它们的列表并没有成功,因为它要么返回空数组,要么返回纯null

型号:

公共类上载文档 { 公共HttpPostedFile文件{get;set;} 公共字符串DocumentId{get;set;} 公共字符串DocumentType{get;set;} } 控制器:

[HttpPost] [ActionNameUploadFile] public ActionResult上载可数文档 { 返回视图; } 上传功能:

var _documents = [];

                for (var i = 0; i < arrayOfFiles.length; i++) {

                    var document = {
                        "File": arrayOfFiles[i].file,
                        "DocumentId": arrayOfFiles[i].documentId,
                        "DocumentType": arrayOfFiles[i].documentName
                    };

                    _documents.push(document);
                }

                $.ajax({
                    url: "@Url.Action("UploadFile", "Home")",
                    type: "POST",
                    data: {"documents":_documents}
                    });
            }
        });

基本上,我通过ajax处理单次上传,如下所示

输入元素

Ajax方法

控制器

试试这个。 var_文件=[]

                for (var i = 0; i < arrayOfFiles.length; i++) {

                    var document = {
                        "File": arrayOfFiles[i].file,
                        "DocumentId": arrayOfFiles[i].documentId,
                        "DocumentType": arrayOfFiles[i].documentName
                    };

                    _documents.push(document);
                }

var formData = new FormData();
formData.append("documents", documents);

                $.ajax({
                    url: "@Url.Action("UploadFile", "Home")",
                    type: "POST",
                    data: formData,
                    processData: false,
                    contentType: false,
                });
            }
        });

如果您想专门使用ajax调用来上传文件:您需要使用FormData对象。文件必须作为FormData对象中的单个项发送,因此不能作为列表的一部分传递给ActionResult

假设页面上有动态数量的文件输入,用户可以填写自定义字段,则代码可能如下所示:

HTML/Javascript:

<form id="File_Form">
    <input type="file" name="File_1" />
    <input type="text" name="DocumentName_File_1" value="doc1" />
    <input type="text" name="DocumentId_File_1" value="1" />

    <input type="file" name="File_2" />
    <input type="text" name="DocumentName_File_2" value="doc2" />
    <input type="text" name="DocumentId_File_2" value="2" />

    <button>Upload Files</button>
</form>

<script>
    $("#File_Form").submit(function() {
        var formData = new FormData(this);

        $.ajax({
            url: '@Url.Action("UploadFiles")',
            type: 'POST',
            data: formData,
            processData: false,
            contentType: false,
            cache: false
        });

        return false;
    });
</script>

它可能不会自动序列化到您的模型对象中,但您仍然可以通过巧妙地命名表单元素来获得所需的结果。

在ajax调用中尝试这一点:data:JSON.stringify{u documents},@user1987392您知道,这就是问题所在,无法在文件对象上使用JSON.stringify,我记不起为什么以及何时使用它,它只返回并清空数组,将其替换到AJAX数据中:JSON.stringify_documents,null,4,它将全部工作correctly@KunalMukherjee我试过了,但控制器收到了一个空值我很确定您需要使用FormData将其发送到workSadly,我以前尝试过这个方法,但由于某种原因,它发送的是一个空数组/列表,var file被设置为null,即使我根据自己的应用程序定制了它
$('#InsertCustomer').click(function () {
        debugger;
            var antiForgeryToken = $("input[name=__RequestVerificationToken]").val();
            var url = '@Url.Action("Add_Customer", "Customer")';

                $.ajax({
                    type: 'POST',
                    headers: { "__RequestVerificationToken": antiForgeryToken },
                    url: url,
                    contentType: false,
                    processData: false,
                    data: getFormData(),
                    success: function (res) {
                            $('#custinsertmodal').modal('hide');
                            $('#custinsertmodal').find("input,textarea,select")
                                .val('')
                                .end()
                                .find("input[type=checkbox], input[type=radio]")
                                .prop("checked", "")
                                .end();
                            bootbox.alert({ message: res.result });   
                    }
                });     
        });
 [HttpPost, ValidateHeaderAntiForgeryToken]
    public JsonResult Add_Customer()
    {
        var errMsg = string.Empty;
        byte[] tmpImage;
        try
        {
            //Customer Image Processing
            var file = Request.Files.Get("file");

            if (file != null && file.ContentLength > 0)
            {
                //Image Saving to Folder
                UploadHelper.UploadFile(file);

                //Image Saving to Database
                tmpImage = new byte[file.ContentLength];
                file.InputStream.Read(tmpImage, 0, file.ContentLength);

                CustomerModel model = new CustomerModel
                {

                    Signature = tmpImage
                };
                _setupRepo.CreateSignatory(model);
                return Json(new { error = false, result = $"Customer was successfully created" }, JsonRequestBehavior.AllowGet);

        }
        catch (Exception ex)
        {
            errMsg = ex.Message.ToString();
            return Json(new { error = true, result = errMsg }, JsonRequestBehavior.AllowGet);
        }
    }
                for (var i = 0; i < arrayOfFiles.length; i++) {

                    var document = {
                        "File": arrayOfFiles[i].file,
                        "DocumentId": arrayOfFiles[i].documentId,
                        "DocumentType": arrayOfFiles[i].documentName
                    };

                    _documents.push(document);
                }

var formData = new FormData();
formData.append("documents", documents);

                $.ajax({
                    url: "@Url.Action("UploadFile", "Home")",
                    type: "POST",
                    data: formData,
                    processData: false,
                    contentType: false,
                });
            }
        });
<form id="File_Form">
    <input type="file" name="File_1" />
    <input type="text" name="DocumentName_File_1" value="doc1" />
    <input type="text" name="DocumentId_File_1" value="1" />

    <input type="file" name="File_2" />
    <input type="text" name="DocumentName_File_2" value="doc2" />
    <input type="text" name="DocumentId_File_2" value="2" />

    <button>Upload Files</button>
</form>

<script>
    $("#File_Form").submit(function() {
        var formData = new FormData(this);

        $.ajax({
            url: '@Url.Action("UploadFiles")',
            type: 'POST',
            data: formData,
            processData: false,
            contentType: false,
            cache: false
        });

        return false;
    });
</script>
[HttpPost]
public ActionResult UploadFiles() {
    foreach (string fileName in Request.Files) {
        HttpPostedFileWrapper file = Request.Files[fileName];
        string documentName = Request.Form[$"DocumentName_{fileName}"]?.ToString();
        string documentId = Request.Form[$"DocumentId_{fileName}"]?.ToString();

        // Do things with your file here.
    }
    return new HttpStatusCodeResult(System.Net.HttpStatusCode.OK);
}