将AntiForgeryToken添加到非Ajax表单提交

时间:2014-12-15 21:44:03

标签: c# forms post antiforgerytoken

我发现了大量示例,演示了如何在AntiForgeryToken调用POST提交方法时添加Ajax。正如标题所示,我的需求是不通过ajax电话提交表格。相反,我只是使用jQuery submit()函数。

我在剃刀视图文件中的内容如下(注意:我使用的是html字符串文字,因为这个特殊的DOM需要在以后动态地附加到单独的元素上):

var html =
    "<form id='exportPdfForm' action='" + exportUrl + "' method='post'>" +
        "<input type='hidden' id='exportContent'>" +
        "<input type='hidden' id='__RequestVerificationToken' value='@Html.AntiForgeryToken()'>" +
    "</form>";

显然,我使用以下jQuery提交此表单:

$("#exportPdfForm").submit();

此外,使用DOM Explorer我可以看到AntiForgeryToken值已正确到位: enter image description here

但是,当我实际提交表单时,仍然会遇到 The required anti-forgery form field "__RequestVerificationToken" is not present 错误。我检查了其他几个Q&amp; A&#39,但似乎找不到任何可能解决我问题的事情。

我在这里遗漏了一些明显或做错的事吗?

编辑(解决方案)

__RequestVerificationToken分配给name属性将解决此问题:

<input type='hidden' name='__RequestVerificationToken' value='...'>

1 个答案:

答案 0 :(得分:3)

这个结果证明是“我怎么想念那个......?!”时刻。虽然上述方法完全合法,但唯一的问题是__RequestVerificationToken必须属于name属性而不是id属于我的初始示例。我尝试使用修复程序发布我的表单,问题现在已经消失。

显然,如果我可以使用<% Html.AntiForgeryToken(); %>表达式,这首先不会成为一个问题,但是这个特殊情况需要采用非常规方法,因为我在我的初始帖子中说明了这一点。所以,我想这是值得注意的事情!