所以我有一个partialview
,我在其中有两个表格,如下所示:
@using (Html.BeginForm("AddAlbum", "Admin", FormMethod.Post, htmlAttributes: new { id = "frmAlbumAdd", novalidate = "novalidate", autocomplete = "off" }))
{
@Html.AntiForgeryToken()
<!--some controls and submit button-->
}
.....
.....
@using (Html.BeginForm("UploadImages", "Admin", FormMethod.Post, htmlAttributes: new { id = "frmUploadImages", novalidate = "novalidate", autocomplete = "off", enctype = "multipart/form-data" }))
{
@Html.AntiForgeryToken()
<!--some controls and submit button-->
}
我正在对ajax post
Admin controller
进行如下操作:
[HttpPost]
[ValidateAntiForgeryToken]//This works well
public JsonResult AddAlbum(AlbumDataModel model)
{
//perform some task and return result
}
[HttpPost]
[ValidateAntiForgeryToken]//This results in Error
public JsonResult UploadImages([Bind(Prefix = "UIAModel")] UploadImageAlbum model)
{
//perform some task and return result
}
我在第二次表单提交时遇到的错误是“所需的防伪表单字段\”__ RequestVerificationToken \“不存在。”
根据此 post in SO ,我们可以antiforgerytokens
分别针对不同的forms
。但我不确定为什么这会成为错误。
我还尝试在@Html.AntiForgeryToken()
加载Layout
加载partialviews
并将其从forms
中排除,并在ajaxSetup
以下发送{{1}但即使这样也行不通。
AntiForgeryToken
我如何克服这个问题?这里到底发生了什么?
更新
我正在使用$.ajaxPrefilter(function (options, originalOptions, jqXHR) {
var verificationToken = $("meta[name='__RequestVerificationToken']").attr('content');
if (verificationToken) {
jqXHR.setRequestHeader("X-Request-Verification-Token", verificationToken);
}
});
将ajax
发布到formdata
,如下所示:
controller
答案 0 :(得分:1)
@Html.AntiForgeryToken()
使用name="__RequestVerificationToken"
生成隐藏输入,以便获得所需的值(对于第一个表单)
var verificationToken = $('#frmAlbumAdd [name=__RequestVerificationToken]').val();
然后您可以使用
将其附加到FormData
对象
formData.append('__RequestVerificationToken', verificationToken);
但是,由于您使用的是FormData
,因此您可以使用
var formdata = new FormData($('#frmAlbumAdd').get(0));
有关详细信息,请参阅this answer
答案 1 :(得分:0)
我可以建议你尝试以下方法:
$("form").on("submit", function (event) {
event.preventDefault();
var form = $(this);
$.ajax({
url: form.attr('action'),
type: "POST",
data: form.serialize(),
success: function (data) {
//your implementation
},
error: function (jqXhr, textStatus, errorThrown) {
alert("Error '" + jqXhr.status + "' (textStatus: '" + textStatus + "', errorThrown: '" + errorThrown + "')");
},
complete: function () {
//your implementation
}
});
});
这不使用json作为数据类型。你真的需要使用json我喜欢你看一下这个How can i supply an AntiForgeryToken when posting JSON data using $.ajax?