Mat*_*ker 7 ajax jquery json csrf asp.net-mvc-3
所以,我一直在用头撞墙,我找不到任何好的消息来源.也许我忘记了模型绑定的东西在MVC3中是如何工作的,但这就是我想要做的事情:我有一些与Knockout绑定的编辑器来处理模型的编辑.模型没什么了不起的:
public class SetupTemplate
{
public int Id { get; set; }
public string Name { get; set; }
public string Template { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我试图呼叫的动作的签名是:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult UpdateTemplate(SetupTemplate template)
Run Code Online (Sandbox Code Playgroud)
从这里的另一个问题,我拿起这个相当有用的片段来获取防伪标记:
window.addAntiForgeryToken = function(data) {
data.__RequestVerificationToken = $('#__AjaxAntiForgeryForm input[name=__RequestVerificationToken]').val();
return data;
};
Run Code Online (Sandbox Code Playgroud)
所有这些都与我一起尝试通过ajax发布更新:
payload = window.addAntiForgeryToken(ko.mapping.toJS(self.data));
$.ajax({
type: "post",
url: endpoint,
data: payload,
success: function(data) {
//Handle success
}});
Run Code Online (Sandbox Code Playgroud)
这导致了Chrome开发人员工具的表单数据部分
Id:1
Name:Greeting
Template: [Template Text]
__RequestVerificationToken: [The really long anti-forgery token]
Run Code Online (Sandbox Code Playgroud)
拾取防伪标记,但我的模型为空.我见过的大多数例子只使用传递的单个参数,而不是模型.
我确定我错过了一些明显的东西,对它可能是什么的任何见解?
编辑:响应@Mark,将调用更改为:
$.ajax({
type: "post",
dataType: "json",
contentType: 'application/json',
url: endpoint,
data: JSON.stringify(payload),
success: function(data) {
//Do some stuff
}});
Run Code Online (Sandbox Code Playgroud)
结果在此请求有效负载中:
{"Id":1,"Name":"Greeting","Template":"...","__RequestVerificationToken":"..."}:
Run Code Online (Sandbox Code Playgroud)
并且服务器没有拿起防伪令牌.无论有没有contentType参数,都试过了$.ajax().
@Mark 因引导我走上正确的道路而受到赞扬,并为我指出了一些链接,这些链接现在让我可以相当透明地处理防伪令牌。然而,解决问题的方法正在发生变化:
public ActionResult UpdateTemplate(SetupTemplate template)
Run Code Online (Sandbox Code Playgroud)
到:
public ActionResult UpdateTemplate(SetupTemplate model)
Run Code Online (Sandbox Code Playgroud)
现在它已经正确填写了值。我真的很想知道为什么会解决这个问题,但目前来说,它有效。
| 归档时间: |
|
| 查看次数: |
5355 次 |
| 最近记录: |