2017-02-06 9 views
0

Ich benutze MVC 5 mit jQuery und habe Schwierigkeiten mit der Veröffentlichung der Anti-Fälschung-Token mit Ajax. Ich habe SO bei verschiedenen Korrekturen angeschaut, aber nichts scheint zu funktionieren.ASP.Net MVC 5 mit jQuery Ajax kann nicht senden __RequestVerificationToken

Ich habe den folgenden Code in meiner Sicht.

@using (Html.BeginForm("None", "None", FormMethod.Post, new { @id = "js-form" })) 
{ 
    @Html.AntiForgeryToken() 
    .... 
    other code 
    .... 
    <button class="button-primary button expand js-button-search" type="button">Search</button> 
} 

mit jQuery Dann habe ich über die Klasse, indem Sie das Element einen Event-Handler auf die Schaltfläche oben hinzugefügt: js-button-Suche. Der Haupt-Ajax-Aufruf lautet wie folgt:

$.ajax({ 
     url: url, 
     method: 'POST', 
     dataType: "json", 
     contentType: "application/json; charset=utf-8", 
     data: JSON.stringify(_self.JsonData), 
     success: function (result) { 
      // Success code 
     }, 
     error: function (jqXHR, textStatus, errorThrown) { 
      // Failure code 
     } 
    }); 

Wo meine Verwirrung ist, ist um den Datenparameter. Ich habe ein Objekt, das bei Bedarf gefüllt wird und eine große Anzahl von Elementen enthält, die für die Suche verwendet werden können.

Das Objekt hat die Form (verkürzt, wie wir Strom von mehr als 40 Suchfelder haben):

_self.JsonData = { "searchData": {"DocIdFrom" : "426737", "DocIdTo" : "753675", "DocIdTypeSearch" : "between", "DocDateFrom" : "06/02/2017", "DocDateTo" : "", "DocDateTypeSearch" : "greater than", ..... 
     etc... 
}} 

Wie Sie sehen können, werden die Daten mit JSON.stringify analysiert. Das alles funktioniert, solange das [ValidateAntiForgeryToken] -Attribut für die Controller-Funktion auskommentiert ist.

-Controller wie folgt:

[HttpPost] 
//[ValidateAntiForgeryToken] 
public JsonResult GetSearchResultsJson(SearchCriteria searchCriteria, int? page) 
{ 
    // code in here 
} 

Als ich Kommentar- der Antifälschungs Attribut, die Seite nicht mehr funktioniert.

Jetzt weiß ich über die Notwendigkeit, die Token passieren über mit der Post und habe folgende ohne Erfolg versucht:

how-can-i-supply-an-antiforgerytoken-when-posting-json-data-using-ajax asp-net-mvc-5-ajax-request-on-edit-page-error-requestverificationtoken-is-not

Der wesentliche Unterschied zwischen dem, was ich habe scheint ein komplexes Objekt zu sein, , aber ich denke, das ist ein Ablenkungsmanöver, da Stringify das Objekt in eine Zeichenkette umwandelt.

Sorry, habe vergessen hinzuzufügen. Fiddler geben die folgende Meldung, wenn die [ValidateAntiForgeryToken]

[Fiddler] ReadResponse() failed: The server did not return a complete response for this request. Server returned 0 bytes. 
+0

noch daran arbeiten. Ich habe das Token in der Kopfzeile des Ajax-Anrufs hinzugefügt und Chrome meldet die folgende Meldung: "Unerwartetes Token gilesrpa

+0

Ich kann den Code nicht mit Formatierung hinzufügen, hier ist die Grundlage dafür: get_searchInputs: function ({) this.JsonData = { "search": { "docIdFrom": docSearch.elem.inputs.txtDocIdFrom.val(), "docIdTo": docSearch.elem.inputs.txtDocIdTo.val(), "ticketSearchTextTo": docSearch.elem.inputs.searchTextTo.val(), etc .... – gilesrpa

+0

Jetzt habe ich das folgende noch ohne Erfolg versucht. https://weblogs.asp.net/dixin/anti-forgery-request-recipes-for-asp-net-mvc-and-ajax – gilesrpa

Antwort

0

aktiviert Ich möchte Stephen Muecke für die Bereitstellung der Lösung für das Problem danken.

Zuerst wurde meine Json Objekt in den folgenden konvertiert:

var data = { "__RequestVerificationToken":$('[name=__RequestVerificationToken]').val(), 
      "searchData": 
      { 
       "DocIdFrom" : "426737", 
       "DocIdTo" : "753675", 
       .............. 
       etc 
      } 
      } 

Dann habe ich den content Parameter aus dem Ajax-Aufruf entfernt und stoppte die Json Daten stingifying.

Dies hatte den gewünschten Effekt und jetzt kann ich den MVC-Controller mit dem [ValidateAntiForgeryToken] -Attribut aufrufen.

0

Das könnte dir RequestVerificationToken (AntiForgeryToken) auf Ajax-Aufruf übergeben, indem Sie eines des Verfahrens:

Methode I: Bei der Verwendung von serialize() oder Formdata() Methoden, ist es nicht notwendig ist, hinzufügen das Token an die Datenparameter getrennt (es wird die ID-Formdata Parameter enthalten sein):

//Send the values of all form controls within the <form> tags including the token: 
var formdata = $('#frmCreate').serialize(); 
//or 
var formdata = new FormData($('#frmCreate').get(0)); 


Methode II:

var token = $('[name=__RequestVerificationToken]').val(); 
$.post(url, { comment: comment, IssueID: postId, __RequestVerificationToken: token }, 
    function (data) { … }) 

Dann können Sie den Controller verwenden, wie unten dargestellt:

[HttpPost] 
[ValidateAntiForgeryToken] 
public JsonResult AddComment(string comment, int IssueID){ 
    //... 
} 

hoffe, das hilft ...