不幸的是,jQuery serialize() 方法不会包含输入文件元素。所以选择的文件用户不会包含在序列化值中。
您可以做的是,创建一个FormData 对象,将文件附加到该对象。您还需要将表单字段值附加到同一 FormData 对象。您可以简单地遍历所有输入字段并添加它。另外,在ajax调用中,需要将processData和contentType属性值指定为false
这应该可以工作
$(function () {
$("form").submit(function (e) {
e.preventDefault();
var formAction = $(this).attr("action");
var fdata = new FormData();
var fileInput = $('#File')[0];
var file = fileInput.files[0];
fdata.append("File", file);
// You can update the jquery selector to use a css class if you want
$("input[type='text'").each(function (x, y) {
fdata.append($(y).attr("name"), $(y).val());
});
$.ajax({
type: 'post',
url: formAction ,
data: fdata,
processData: false,
contentType: false
}).done(function(result) {
// do something with the result now
console.log(result);
});
});
});
上面的代码是从表单(已经提交)中读取 action 属性,并将其用作 ajax 表单提交的 url。
@model YourViewModel
<form asp-action="Index" asp-controller="Home" method="post" >
<label asp-for="DocumentOwner"></label>
<input type="text" asp-for="DocumentOwner" />
<label asp-for="DocumentTypeId"></label>
<input type="text" asp-for="DocumentTypeId" />
<label asp-for="File"></label>
<input asp-for="File" />
<input type="submit" />
</form>
在您的 HttpPost 操作方法中,您可以使用与参数相同的视图模型。下面的示例代码读取File属性并将其保存到wwwroot目录内的uploads目录中。
public class HomeController : Controller
{
private readonly IHostingEnvironment hostingEnvironment;
public HomeController(IHostingEnvironment environment)
{
hostingEnvironment = environment;
}
[HttpPost]
public IActionResult Index(YourViewModel vm)
{
if (ModelState.IsValid)
{
if (vm.File != null)
{
var uploads = Path.Combine(hostingEnvironment.WebRootPath, "uploads");
var filePath = Path.Combine(uploads, GetUniqueFileName(vm.File.FileName));
vm.File.CopyTo(new FileStream(filePath, FileMode.Create));
return Json(new {status = "success", message = "Successfully saved"});
}
}
else
{
// handle what to do when model validation fails
}
return Json(new {status = "error", message = "something wrong!"});
}
private string GetUniqueFileName(string fileName)
{
fileName = Path.GetFileName(fileName);
return Path.GetFileNameWithoutExtension(fileName)
+ "_" + Guid.NewGuid().ToString().Substring(0, 4)
+ Path.GetExtension(fileName);
}
}