У меня есть контроллер, который имеет два метода действия. Оба они отмечены [ValidateAntiForgeryToken()]
, а @Html.AntiForgeryToken()
включено в соответствующий вид. Теперь вызов одного из этих методов (GetVendorOrders
: чьи результаты связаны с сеткой кендо) успешен, а другой (MakeVendorPayment
) вызывает исключение "The required anti-forgery form field __RequestVerificationToken is not present" even when both are provided with __RequestVerificationToken value.
Я пробовал следующими 3 способами:
Передача токена в параметре заголовков AJAX, например:
headers: { '__RequestVerificationToken': token }
Передача токена в параметре данных AJAX, например:
data: JSON.stringify({ vendorId: vId, orderIds: oIds, __RequestVerificationToken: token })
Добавление значения токена и его передача в AJAX,
data.__RequestVerificationToken = token;
- Ниже приведены методы действия:
[HttpPost]
[ValidateAntiForgeryToken()]
public virtual ActionResult GetVendorOrders(DataSourceRequest command, VendorPaymentSearchModel model)
{
var orders = _orderService.SearchOrders(vendorId: model.VendorId, createdFromUtc: model.StartDate, createdToUtc: model.EndDate);
var gridModel = new DataSourceResult
{
Data = orders.Select(x =>
{
return new OrderModel
{
CustomOrderNumber = x.CustomOrderNumber,
CustomerFullName = x.CustomerFullName,
CustomerEmail = x.CustomerEmail,
OrderTotal = x.OrderTotal,
Commission = x.Commission,
VendorPayment = x.OrderTotal - x.Commission
};
}),
};
return Json(gridModel);
}
[HttpPost]
[ValidateAntiForgeryToken()]
public virtual ActionResult MakeVendorPayment(int vendorId, string[] orderIds)
{
foreach (var orderId in orderIds)
{
var order = _orderService.GetOrderById(Convert.ToInt32(orderId));
var vendorPayment = new VendorPayment()
{
VendorId = vendorId,
OrderId = Convert.ToInt32(orderId),
OrderTotal = order.OrderTotal,
Commission = order.Commission,
Payment = order.OrderTotal - order.Commission
};
_vendorPaymentService.InsertVendorPayment(vendorPayment);
}
return Json(new { Result = true });
}
`//Following are Javascript functions:
//This Call Successful
$(document).ready(function () {
$("#orders-grid").kendoGrid({
dataSource: {
type: "json",
transport: {
read: {
url: "@Html.Raw(Url.Action("GetVendorOrders", "Vendor"))",
type: "POST",
dataType: "json",
data: additionalData
}
},
},
dataBound: onDataBound,
columns: [
{
field: "Id",
field: "Id",
width: 50
},
{
field: "CustomOrderNumber",
title: "Order #",
width: 80
},
{
field: "OrderStatus",
title: "Order Status",
width: 100
},
{
field: "OrderTotal",
title: "Order Total",
width: 100
},
{
field: "Commission",
title: "Commission",
width: 100
},
{
field: "VendorPayment",
title: "VendorPayment",
width: 100
}
]
});`
//This results into error: The required anti-forgery form field "__RequestVerificationToken" is not present.
//Commented parts are the other ways that are tried.
$('#vendor-payment').click(function (e) {
e.preventDefault();
var orderIds = [];
var data = $("#orders-grid").data("kendoGrid").dataSource._data;
for (i = 0; i < data.length; i++) {
orderIds.push(data[i].CustomOrderNumber);
}
//var token = $('input[name=__RequestVerificationToken]').val();
$.ajax({
url: '@Url.Action("MakeVendorPayment", "Vendor")',
type: 'POST',
dataType: 'json',
//cache: false,
//headers: { '__RequestVerificationToken': token },
//data: addAntiForgeryToken({ vendorId: vId, orderIds: oIds }),
data: JSON.stringify({ vendorId: vId, orderIds: oIds, __RequestVerificationToken: token })
contentType: 'application/json; charset=utf-8',
success: function (result) {
console.log(result);
var grid = $("#orders-grid").data("kendoGrid");
grid.dataSource.read();
},
error: function (objAjaxRequest, strError) {
var respText = objAjaxRequest.responseText;
console.log(respText);
}
});
});
function addAntiForgeryToken(data) {
if (!data) {
data = {};
}
var token = $('input[name=__RequestVerificationToken]');
if (token.length) {
data.__RequestVerificationToken = token.val();
}
return data;
};
});
Я удивлен, что функция, к которой привязана сетка (которая вызывает GetVendorOrders), успешна, но нажатие кнопки (которое вызывает MakeVendorPayment) выдает ошибку: Обязательное поле формы защиты от подделки "__RequestVerificationToken" отсутствует.