我正在使用asp.net mvc 5并创建一个通过ajax登录的表单(服务器端需要[ValidateAntiForgeryToken]
)。
我在视图中没有任何问题:
@using (Html.BeginForm("Login", "Account", FormMethod.Post, new { id = "loginForm" }))
{
@Html.AntiForgeryToken()
<!-- more tags -->
}
但我收到错误消息
无法解密防伪令牌。
当我尝试调用此方法时:
//u is url string, f is FormData()
var submit = function (u, f) {
$.ajax({
url: u,
type: 'POST',
data: { __RequestVerificationToken: $($('#loginForm input[name=__RequestVerificationToken]')[0]).val(), model: f },
processData: false,
contentType: false
}).done(function (data) {
if (data.success) {
/* successfull login */
Custombox.close();
window.location.href = '/?type=promotion'
} else {
/* server returned exception message */
$('div.validation-summary-valid').html(data.ex)
}
}).fail(function (error) {
/* connect to server failure */
$('div.validation-summary-valid').html(data.ex)
})
};
以下是标题快照:
为什么要复制__RequestVerificationToken
以及如何解决它?
答案 0 :(得分:1)
我猜你要发两次。
一旦显式地通过读取f
变量中的输入字段值和第二个,我假设它是一个序列化的形式。
解决方案:删除您明确发送的部分。
您只需序列化表单并发送即可。这将包括RequestVerificationToken。
$(function () {
$("#yourSubmitBtnId").click(function (e) {
e.preventDefault();
var f = $("#loginForm");
var formData = JSON.stringify(f.serialize());
var u = f.attr("action");
$.ajax({
url: u,
type: 'POST',
data:formData,
processData: false,
contentType: "application/json",
}).done(function (data) {
//do something
}).fail(function (error) {
//do something else
});
});
});