【发布时间】:2016-12-24 07:45:45
【问题描述】:
我曾尝试在 MVC5 项目中使用 AJAX 调用,就像网络上的许多类似示例一样,但每次出现错误时,例如 antiforgerytoken、500 等。我正在寻找一个适当的 AJAX 调用方法和控制器操作方法具有所有必要的属性并将模型数据从 View 发送到 Controller Action。以下是我使用的方法:
查看:
@using (Html.BeginForm("Insert", "Account", FormMethod.Post, new { id = "frmRegister" }))
{
@Html.AntiForgeryToken()
//code omitted for brevity
}
<script>
AddAntiForgeryToken = function (data) {
data.__RequestVerificationToken = $('#__AjaxAntiForgeryForm input[name=__RequestVerificationToken]').val();
return data;
};
$('form').submit(function (event) {
event.preventDefault();
//var formdata = JSON.stringify(@Model); //NOT WORKING???
var formdata = new FormData($('#frmRegister').get(0));
//var token = $('[name=__RequestVerificationToken]').val(); //I also tried to use this instead of "AddAntiForgeryToken" method but I encounter another error
$.ajax({
type: "POST",
url: "/Account/Insert",
data: AddAntiForgeryToken({ model: formdata }),
//data: { data: formdata, __RequestVerificationToken: token },
//contentType: "application/json",
processData: false,
contentType: false,
datatype: "json",
success: function (data) {
$('#result').html(data);
}
});
});
</script>
Controller: 由于 antiforgerytoken 或类似问题,代码无法命中此 Action 方法。
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public JsonResult Insert(RegisterViewModel model)
{
try
{
//...
//code omitted for brevity
}
}
我只需要一个适当的 AJAX 和 Action 方法,它们可以用于 MVC5 中的 CRUD 操作。任何帮助将不胜感激。
更新:以下是我需要澄清的几点:
1)我们没有使用“__RequestVerificationToken”,我不确定我们是否正确地将它发送到控制器(它似乎是 Firebug 的请求标头中的 cookie,但我不确定它是否可以)。任何想法?
2) 我应该使用 var formdata = new FormData($('#frmRegister').get(0));当我上传文件?
3) 为什么我必须避免在这种情况下使用 processData 和 contentType?
4) AJAX方法的Controller方法和错误部分是否OK?还是那里有任何遗漏或多余的部分?
【问题讨论】:
-
使用
var formdata = new FormData($('#frmRegister').get(0));将包含防伪令牌。你只需要data: formdata,虽然不清楚你为什么使用FormData(你也在上传文件吗?)
标签: javascript jquery asp.net ajax asp.net-mvc