返回
HTML 表单文档上传时 Ajax 调用返回 500 错误的解决方案
javascript
2024-03-18 08:24:41
HTML 表单中文档上传的解决方案
问题
在 HTML 表单中使用表单上传文档时,你可能会遇到 Ajax 调用无法触发控制器方法的问题,并显示错误代码 500。
解决方案
为了解决此问题,需要对表单提交方式、Ajax 请求格式和控制器方法参数进行修改。
表单提交
避免在另一个表单中嵌套表单来上传文档。使用 FormData
对象将文件和表单数据收集到一起。
Ajax 请求格式
Ajax 请求的 data
属性应为 FormData
对象。此外,还需设置 contentType
和 processData
属性为 false
。
控制器方法参数
控制器方法应采用与 DocumentViewModel
相同类型或类似类型的参数。
修改后的代码
以下是如何修改代码以解决此问题:
jQuery 方法:
$('body').on('click', '#UploadDoc', function (e) {
e.preventDefault();
debugger;
var btnCaption = $(this).text();
if (btnCaption == "Upload") {
$('#FileName').rules("add", {
required: true,
messages: {
required: "Please choose document to upload.",
}
});
} else {
$("#FileName").rules("remove");
}
var fileData = $("#documentViewModel_FileName").prop('files')[0];
var formData = new FormData();
formData.append('file', fileData);
formData.append('DocumentName', $("#documentViewModel_DocumentName").val());
formData.append('DocumentType', $("#documentViewModel_DocumentType").val());
formData.append('UploadedBy', $("#documentViewModel_DocumentType").val());
$.ajax({
url: "/Controller/SaveDoc",
type: "POST",
contentType: false,
processData: false,
beforeSend: function () {
$(".page-loader").css("display", "block");
},
data: formData,
success: function () {
console.log('success data file');
},
error: function (jqXHR, textStatus, errorThrown) {
if (jqXHR.status == 400) {
LogoutForSessionExpiration();
} else {
$(".page-loader").css("display", "none");
toastr.error("Error Occurred");
}
}
});
});
控制器方法:
[HttpPost]
public JsonResult SaveDoc([FromForm] DocumentViewModel DocumentViewModel)
{
JsonResponse jsonResponse;
bool result;
try
{
...
}
catch (Exception ex)
{
...
}
}
结论
通过实现这些修改,你应该能够解决 Ajax 调用中遇到的错误 500,并成功在 HTML 表单中上传文档。
常见问题解答
- 为什么不能在表单中嵌套表单来上传文档?
在表单中嵌套表单会产生浏览器无法处理的复杂嵌套结构。
- 为什么
FormData
对象需要用于 Ajax 请求?
FormData
对象允许以二进制格式发送文件数据,而这是 Ajax 请求所需格式。
- 为什么需要设置
contentType
和processData
属性?
设置 contentType
和 processData
为 false
会禁用 jQuery 自动将 FormData
对象转换为字符串的过程。
- 控制器方法的参数类型为什么很重要?
控制器方法的参数类型必须与请求中发送的数据类型匹配,以便正确绑定数据。
- 如何调试此问题?
在代码中设置断点并使用浏览器开发工具来检查 Ajax 请求和响应,可以帮助识别问题并找出解决方案。