jquery – 使用Anti-forgery令牌将JSON模型发布到ASP.Net MVC3

前端之家收集整理的这篇文章主要介绍了jquery – 使用Anti-forgery令牌将JSON模型发布到ASP.Net MVC3前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
所以,我一直在用头撞墙,我找不到任何好的消息来源.也许我忘记了模型绑定的东西在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)

从这里的另一个问题,我拿起这个相当有用的片段来获取防伪标记

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',data: JSON.stringify(payload),success: function(data) {
    //Do some stuff
}});

结果在此请求有效负载中:

{"Id":1,"Name":"Greeting","Template":"...","__RequestVerificationToken":"..."}:

并且服务器没有拿起防伪令牌.无论使用和不使用$.ajax()的contentType参数,都尝试过这种方法.

解决方法

映射不能与参数作为模板一起使用,因为它与具有相同名称属性之一冲突(方位情况).如果您使用除模板之外的任何其他内容,它将适用于该控制器参数.

有一个解释细节的链接,我现在无法轻易找到.

public class SetupTemplate
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Template { get; set; }
}

猜你在找的jQuery相关文章