【发布时间】:2012-08-24 19:05:01
【问题描述】:
所以,我一直在用这个撞墙,我找不到任何好的来源。也许我忘记了模型绑定的东西在 MVC3 中是如何工作的,但这是我想要做的:我有一个与 Knockout 绑定的编辑器来处理模型的编辑。该模型没有太多内容:
public class SetupTemplate
{
public int Id { get; set; }
public string Name { get; set; }
public string Template { get; set; }
}
我试图调用的动作的签名是:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult UpdateTemplate(SetupTemplate template)
从这里的另一个问题中,我选择了这个相当有用的 sn-p 来获取防伪令牌:
window.addAntiForgeryToken = function(data) {
data.__RequestVerificationToken = $('#__AjaxAntiForgeryForm input[name=__RequestVerificationToken]').val();
return data;
};
这一切都与我一起尝试通过 ajax 发布更新:
payload = window.addAntiForgeryToken(ko.mapping.toJS(self.data));
$.ajax({
type: "post",
url: endpoint,
data: payload,
success: function(data) {
//Handle success
}});
这会导致 Chrome 开发者工具的表单数据部分出现这种情况
Id:1
Name:Greeting
Template: [Template Text]
__RequestVerificationToken: [The really long anti-forgery token]
防伪令牌被拾取,但我的模型为空。我见过的大多数例子只使用一个传递的参数,而不是模型。
我确定我遗漏了一些明显的东西,关于它可能是什么的任何见解?
编辑: 响应@Mark,将调用更改为:
$.ajax({
type: "post",
dataType: "json",
contentType: 'application/json',
url: endpoint,
data: JSON.stringify(payload),
success: function(data) {
//Do some stuff
}});
产生这样的请求负载:
{"Id":1,"Name":"Greeting","Template":"...","__RequestVerificationToken":"..."}:
并且服务器没有获取防伪令牌。这在有和没有 contentType 参数到 $.ajax() 的情况下都进行了尝试。
【问题讨论】:
标签: jquery ajax json asp.net-mvc-3 csrf