我正在尝试将AntiForgery令牌和字符串化的序列化对象都传递给操作,但是经过种种尝试,我仍然不能。
我试图将它们作为逗号分隔的参数发送,并且将令牌包括在字符串化参数中。
var jsonModelData = JSON.stringify(
{
'personViewModel': serializedObject['PersonViewModel'],
'identityUserViewModel': serializedObject['IdentityUserViewModel'],
'entityPersonAddressViewModel' : entityAddressSerializedObject['EntityPersonAddresses'],
'telephoneViewModel': telephoneSerializedObject,
'virtualAddressViewModel': virtualAddressSerializedObject
});
$.ajax({
type: "POST",
//contentType: "application/json; charset=utf-8",
dataType: "json",
url: "@Url.Action("Save")",
data: { __RequestVerificationToken: token }, jsonModelData,
success: function (data)
{
对验证器有效,但是序列化对象的stringified参数为null 然后是这个(它不会超过[ValidateAntiForgeryToken])
var jsonModelData = JSON.stringify(
{
'__RequestVerificationToken': token,
'personViewModel': serializedObject['PersonViewModel'],
'identityUserViewModel': serializedObject['IdentityUserViewModel'],
'entityPersonAddressViewModel': entityAddressSerializedObject['EntityPersonAddresses'],
'telephoneViewModel': telephoneSerializedObject,
'virtualAddressViewModel': virtualAddressSerializedObject
});
$.ajax({
type: "POST",
//contentType: "application/json; charset=utf-8",
dataType: "json",
url: "@Url.Action("Save")",
data: jsonModelData,
和操作:
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Save(PersonViewModel personViewModel
, IdentityUserViewModel identityUserViewModel
, List<EntityPersonAddress> entityPersonAddressViewModel
, List<TelephoneViewModel2> telephoneViewModel
, List<VirtualAddressViewModel> virtualAddressViewModel)
{
}
编辑和解决方案:
我不得不将动作的参数更改为命名参数,并将各种对象捆绑在一个类下,并将Token作为ajax中的第一个参数,并且还省略了“ application / json; etc”的ajax contentType。>
现在看起来像这样。
$.ajax({
type: "POST",
dataType: "json",
url: "@Url.Action("Save")",
data: { __RequestVerificationToken: token, MultiViewModel: jsonModelData},
和操作:
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Save(PersonUserModel MultiViewModel) {
其中“ PersonViewModel”是一个类,其中包含所有以前的和单独声明的viewModel。
答案 0 :(得分:0)
您可以在$ .ajax调用中添加标题。
$.ajax({
type: "POST",
headers: { "csrf-token": token }
用类似这样的方法填充令牌变量
@inject Microsoft.AspNetCore.Antiforgery.IAntiforgery Xsrf
<script type="text/javascript">
window.token = "@Xsrf.GetAndStoreTokens(Context).RequestToken";
</script>
答案 1 :(得分:0)
根据问题中的“编辑”回答: