AntiforgeryToken适用于一种形式,而在第二种形式的部分视图MVC中失败

时间:2015-11-03 17:22:59

标签: ajax asp.net-mvc asp.net-mvc-4 antiforgerytoken

所以我有一个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

2 个答案:

答案 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?