使用json对象ASP.NET MVC在ajax帖子中进行antiforgerytoken

时间:2018-05-18 16:51:42

标签: .net json ajax antiforgerytoken

使用antiforgerytoken将转换后的json对象发布到控制器时遇到问题。传递的参数questionnaireViewModel为空。 我试图添加到ajax:

contentType: "application/json",

headers: { '__RequestVerificationToken': token },

但没有任何改变。你能帮帮我吗?

@using (Html.BeginForm("PostQuestionnaire", "Home", FormMethod.Post, new { id = "__AjaxAntiForgeryQuestionnaireForm" }))
{
    @Html.AntiForgeryToken()
}

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult PostQuestionnaire(QuestionnaireViewModel questionnaireViewModel)
    { ... }

$('#submitBtn').on('click', function () {

   var questionnaireVM = JSON.stringify({
    'questionnaireViewModel': {
        'QuestionnaireId': $('#QuestionnaireId').val(),
        'Revision': $('#Revision').val(),
        'IPAddress': '',        
    }
});

var form = $('#__AjaxAntiForgeryQuestionnaireForm');
var token = $('input[name="__RequestVerificationToken"]', form).val();

$.ajax({
    type: "POST",
    url: "./PostQuestionnaire",
    data: { 
            __RequestVerificationToken: token, 
            questionnaireVM 
        },
    success: function (result) {
        if (result.success) {
            console.log("success");

        } else {
            console.log("fail");
        }
    },
    error: function (request) {
            console.log("error");
    }
});

1 个答案:

答案 0 :(得分:1)

您不需要在POST方法中对数据进行字符串化,只需创建一个json对象:

let d = {
    'QuestionnaireId': $('#QuestionnaireId').val(),
    'Revision': $('#Revision').val(),
    'IPAddress': '',        
}

并使用以下代码替换Ajax调用中的数据部分:

data: { 
        __RequestVerificationToken: token, 
        questionnaireViewModel: d
    },