我想通过Ajax将Json数据传递给Controller(之前我曾提到过AntiForgery and JSON incompatible?)这是我的代码:
的Ajax:
var self = this;
self.Url = ko.observable();
self.Description = ko.observable();
self.ValueName = ko.observable();
self.MatchRegex = ko.observable();
self.__RequestVerificationToken = ko.observable('@Html.AntiForgeryTokenValueOrchard()');
self.Xpaths = ko.observableArray([
{ Name: 'RootXPath', Xpath: '', Regex: '', isRootXPath: true }
]);
self.addRow = function () {
self.Xpaths.push({ Name: '', Xpath: '', Regex: '', isRootXPath: false });
};
self.removeRow = function () {
if (this.name == 'RootXPath')
return;
self.Xpaths.remove(this);
};
self.executeExtractScript = function () {
var myValues = JSON.stringify(ko.toJS(self));
$.ajax({
url: '@Url.Action("EExtractScriptTemp", "Home", new { area = "Crawler" })',
type: 'POST',
data: myValues,
contentType: 'application/json; charset=utf-8',
success: function () {
$(".result").html("Success");
runEffect();
},
error: function () {
$(".result").html("Error");
runEffect();
}
});
};
我的控制器
[HttpPost]
public ActionResult EExtractScriptTemp(ExtractScriptTempModels objectJSon) {
return null;
}
myValues 的真正价值在于(通过检查Chrome中的元素):
"{"__RequestVerificationToken":"6ygUGMe1PER7FizLBqCDJLcSfp9zuA4dcRyUHCwVwkWzOTO0AiRF8QRSDwoqRI-SD9FfiFvF-jozFKL10HS21xTBlRP4EndYbmGhPSX_Kuk1F0r0swYnGZZxZdy793eQxfmkvjIUtnwdLtrg0q8zhFdZNJBvmiPA6dC57prmw1c1","Xpaths":[{"Name":"RootXPath","Xpath":"","Regex":"","isRootXPath":true}]}"
然而,它仍然上升错误
{“所需的防伪表格字段\”__ RequestVerificationToken \“ 不存在。“}
我曾试图同时使用@ Matthew的方法和@Giscard Biamby,但这已经不再适用了。
我的问题是什么? 非常感谢!
答案 0 :(得分:0)
不要对有效负载进行字符串化。让jQuery负责发送数据。现有代码中有一些示例。在Orchard代码中搜索$.post(
。你会在Orchard.MediaPicker中找到一个。
答案 1 :(得分:0)
尝试将[ValidateAntiForgeryToken]
添加到函数的头部
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult EExtractScriptTemp(ExtractScriptTempModels objectJSon) {
return null;
}
在客户端我发送这样的数据
//find the Token
var token = $('input[name="__RequestVerificationToken"]').val();
data: {
"someText": "Text",
"__RequestVerificationToken": token
},
此更改错误消失后(在我的情况下)