如何将防伪令牌和序列化对象作为参数传递给MVC操作

时间:2019-06-26 11:20:35

标签: jquery ajax asp.net-mvc antiforgerytoken

我正在尝试将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。

2 个答案:

答案 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)

根据问题中的“编辑”回答: