【发布时间】:2015-12-23 03:40:56
【问题描述】:
所以我想通过 AJAX 将 POST 文件上传和 AntiForgeryToken 一起上传。这是我的代码:
查看
@using (Html.BeginForm("Upload", "RX", FormMethod.Post, new {id = "frmRXUpload", enctype = "multipart/form-data"}))
{
@Html.AntiForgeryToken()
@Html.TextBoxFor(m => m.RXFile, new {.type = "file"})
...rest of code here
}
<script>
$(document).ready(function(){
$('#btnRXUpload').click(function () {
var form = $('#frmRXUpload')
if (form.valid()) {
var formData = new FormData(form);
formData.append('files', $('#frmRXUpload input[type="file"]')[0].files[0]);
formData.append('__RequestVerificationToken', fnGetToken());
$.ajax({
type: 'POST',
url: '/RX/Upload',
data: formData,
contentType: false,
processData: false
})
}
})
})
</script>
控制器
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Upload()
{
//rest of code here
}
我明白了
无法解密防伪令牌。如果此应用程序由 Web Farm 或集群托管
通过提琴手出错。知道如何解决这个问题吗?
我找到了答案:
<script>
$(document).ready(function(){
$('#btnRXUpload').click(function () {
var form = $('#frmRXUpload')
if (form.valid()) {
var formData = new FormData(form.get(0)); //add .get(0)
formData.append('files', $('#frmRXUpload input[type="file"]')[0].files[0]);
$.ajax({
type: 'POST',
url: '/RX/Upload',
data: formData,
contentType: false,
processData: false
})
}
})
})
</script>
【问题讨论】:
-
什么是
fnGetToken()? -
如果应用程序未托管在 Web Farm 或集群上,此行为是否会改变?非 ajax 请求有效吗?
-
@StephenMuecke:获取令牌字符串的函数
-
是的,但它返回了什么?为什么不按照我对您的previous questions 之一的回答使用
var formdata = new FormData($('form').get(0));? -
错误消息表明它可能与this question的答案之一有关
标签: c# jquery ajax asp.net-mvc asp.net-mvc-5