C# 如何将原始复杂对象传递给MVC操作?
问题:无法将文件对象解析为JSON字符串,在尝试将复杂类型发送到MVC控制器时,仅获取空值 我尝试将其添加到FormData对象中并将其传递给控制器,但是,传递它们的列表并没有成功,因为它要么返回空数组,要么返回纯null 型号: 公共类上载文档 { 公共HttpPostedFile文件{get;set;} 公共字符串DocumentId{get;set;} 公共字符串DocumentType{get;set;} } 控制器: [HttpPost] [ActionNameUploadFile] public ActionResult上载可数文档 { 返回视图; } 上传功能: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]
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);
}