J’ai la méthode suivante dans le contrôleur
[HttpPost] [Authorize(Roles ="Klient")] [ValidateAntiForgeryToken] public ActionResult GetAvaiableHouses(DateTime startDate, DateTime endDate) { Session.Remove("Reservation"); IEnumerable avaiableHouses = repository.GetAllNamesAvaiableHouses(repository.GetAvaiableHousesInTerm(startDate, endDate)); List houses = new List(); avaiableHouses.ToList().ForEach(item => houses.Add(item.Value)); if(avaiableHouses.ToList().Count == 0) { return new EmptyResult(); } Session["Reservation"] = new NewReservation() { StartDate = startDate, EndDate = endDate, AvaiableHouses = avaiableHouses }; return PartialView("~/Views/Shared/_AvaiableHousesPartial.cshtml", houses); }
Cette méthode est appelée à l’aide du script ajax dans View.cshtml.
$(function () { $("#btnCheckAvaiableHouses").click(function () { $.ajax({ type: "POST", url: "/ClientReservations/GetAvaiableHouses", data: '{startDate: "' + $("#startdate").val() + '",endDate:"' + $("#enddate").val() + '",__RequestVerificationToken:"' + $('input[name=__RequestVerificationToken]').val() +'" }', contentType: "application/json; charset=utf-8", dataType: "text", success: function (response) { $('#avaiableHouses').html(response) if (!$('#avaiableHouses').is(':empty')) { document.getElementById("btnConfirmTerm").style.visibility = 'visible'; } else { $('#avaiableHouses').html('Brak dostępnych domków w podanym terminie') } }, failure: function (response) { alert(response.responseText); }, error: function (response) { alert(response.responseText); } }); }); });
Ceci est la section des boutons avec celle-ci qui appelle ce script
J’ai ajouté le paramètre supplémentaire
'",__RequestVerificationToken:"' + $('input[name=__RequestVerificationToken]').val()
dans un script ajax mais lors de l’exécution, je reçois toujours l’erreur
, __ RequestVerificationToken n’est pas présent.
Quelle pourrait être la raison?
Si vous codifiez les données et utilisez contentType: 'application/json
, ajoutez le jeton aux en-têtes ajax, par exemple
var headers = { __RequestVerificationToken: $('input[name="__RequestVerificationToken"]').val() }; $.ajax({ headers: headers, data: ... // remove the token from your existing implementation .... });
et vous devez ensuite créer un FilterAtsortingbute
personnalisé pour lire la valeur à partir des en-têtes.
[AtsortingbuteUsage(AtsortingbuteTargets.Method | AtsortingbuteTargets.Class, AllowMultiple = false, Inherited = true)] public sealed class ValidateHeaderAntiForgeryTokenAtsortingbute : FilterAtsortingbute, IAuthorizationFilter { public void OnAuthorization(AuthorizationContext filterContext) { if (filterContext == null) { throw new ArgumentNullException("filterContext"); } var httpContext = filterContext.HttpContext; var cookie = httpContext.Request.Cookies[AntiForgeryConfig.CookieName]; AntiForgery.Validate(cookie != null ? cookie.Value : null, httpContext.Request.Headers["__RequestVerificationToken"]); } }
et dans votre méthode de contrôleur, remplacez [ValidateAntiForgeryToken]
par [ValidateHeaderAntiForgeryToken]
Cependant, il n’est pas nécessaire de hiérarchiser les données et vous pouvez utiliser
var data = { startDate: $("#startdate").val(), endDate: $("#enddate").val(), __RequestVerificationToken: $('input[name=__RequestVerificationToken]').val() }; $.ajax({ data: data, .... });
et supprimez l’option contentType
pour qu’elle utilise la valeur par défaut 'application/x-www-form-urlencoded; charset=UTF-8'
'application/x-www-form-urlencoded; charset=UTF-8'
Vous n’avez pas montré votre formulaire, en supposant qu’il contienne @Html.AntiForgeryToken()
et @Html.TextBoxFor(m => m.startDate)
et @Html.TextBoxFor(m => m.endDate)
pour que vous générez des contrôles de formulaire avec name="startDate"
et name="endDate"
, vous pouvez simplement utiliser
var data = $('form').serialize(); $.ajax({ data: data, .... });
pour sérialiser tous vos contrôles de formulaire, y compris le jeton